php - XPath 一次选择多个元素?

标签 php xml xpath

我目前正在这样做是为了构建一个名为 $tables 的数组,但想知道是否有更简单的方法来做到这一点?

$tables = array();
$abbr = $states_xml->xpath('//StateAbbr');
$names = $states_xml->xpath('//StateName');

// State Abbreviations...
while(list($key,$table) = each($abbr)) {
    $tables[$key]['Abbr'] = (string) trim($table);
}

// State Names...
while(list($key,$name) = each($names)) {
    $tables[$key]['Name'] = (string) trim($name);
}

是否可以一次性调用 StateAbbrStateName 元素,并将它们以与 $tables 相同的格式输出到数组中> 是?

因此,表格数组将如下所示:

array(57) {
  [0]=>
  array(2) {
    ["Abbr"]=>
    string(2) "AL"
    ["Name"]=>
    string(7) "Alabama"
  }
  [1]=>
  array(2) {
    ["Abbr"]=>
    string(2) "AK"
    ["Name"]=>
    string(6) "Alaska"
  }
  [2]=>
  array(2) {
    ["Abbr"]=>
    string(2) "AS"
    ["Name"]=>
    string(14) "American Samoa"
  }
... and so on...

基本上,$states_xml 看起来像这样:

<diffgr:diffgram
    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
    xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <NewDataSet
        xmlns="">
        <Table diffgr:id="Table1" msdata:rowOrder="0">
            <StateAbbr>AL </StateAbbr>
            <StateName>Alabama</StateName>
        </Table>
        <Table diffgr:id="Table2" msdata:rowOrder="1">
            <StateAbbr>AK </StateAbbr>
            <StateName>Alaska</StateName>
        </Table>
        <Table diffgr:id="Table3" msdata:rowOrder="2">
            <StateAbbr>AS </StateAbbr>
            <StateName>American Samoa</StateName>
        </Table>
        <Table diffgr:id="Table4" msdata:rowOrder="3">
            <StateAbbr>AP </StateAbbr>
            <StateName>AP</StateName>
        </Table>
        ...
    </NewDataSet>
</diffgr:diffgram>

我正在使用 $states_xml = simplexml_load_string(THE STRING ABOVE); 将 xml 加载到 $states_xml 中。

无论如何,要从这里的所有 Table 元素中获取所有 StateAbbrStateName 并一次性以数组形式输出?对我来说似乎有可能,但除了我目前正在做的方式之外,不知道如何解决这个问题。

最佳答案

您应该迭代它们的父元素节点。这些表达式与 SimpleXMLElement 表示的节点相关,但在您的情况下不需要:

$diffgram = new SimpleXMLElement($xml);

$result = [];
foreach($diffgram->xpath('.//Table') as $table) {
  $result[] = [
    'Abbr' => trim($table->StateAbbr),
    'Name' => trim($table->StateName)
  ];
}

var_dump($result);

输出:

array(4) {
  [0]=>
  array(2) {
    ["Abbr"]=>
    string(2) "AL"
    ["Name"]=>
    string(7) "Alabama"
  }
  [1]=>
  array(2) {
    ["Abbr"]=>
    string(2) "AK"
    ["Name"]=>
    string(6) "Alaska"
  }
  [2]=>
  array(2) {
    ["Abbr"]=>
    string(2) "AS"
    ["Name"]=>
    string(14) "American Samoa"
  }
  [3]=>
  array(2) {
    ["Abbr"]=>
    string(2) "AP"
    ["Name"]=>
    string(2) "AP"
  }
}

在 DOM 中,它看起来几乎相同,但这里您需要 Xpath 表达式来获取详细信息。

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

$result = [];
foreach($xpath->evaluate('.//Table') as $table) {
  $result[] = [
    'Abbr' => $xpath->evaluate('normalize-space(StateAbbr)', $table),
    'Name' => $xpath->evaluate('normalize-space(StateName)', $table)  
  ];
}

var_dump($result);

关于php - XPath 一次选择多个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39781231/

相关文章:

php类异常处理问题

php - preg_replace : how do I strip off all white space and &nbsp;?

xml - 使用 xPath 时是否可以忽略 c# 中的 namespace ?

c# - 在 XPath 中查找带有空格的类

python - Scrapy shell 中的奇怪 XPath 结果

php - Magento如何存储用户数据

php - 使用 PHP 和 Ajax 进行 MySQL 查询

xml - 按属性排列的 XSLT 子级列表

xml - 使用 XPath 查找包含给定子元素的元素的清晰方法?

c# - 将 XML(以格式化方式)显示到 Razor Textarea