0
<Node name="node1">
  <x x="x"/>
  <x x="xxx"/>
</Node>

<Node name="node2">
  <x x="xx"/>
  <x x="xxxx"/>
</Node>

好的,这是一个 XML 示例:

我使用 simplexml_load_file 调用它的内容

如果我想调用一个特定的节点内容,它应该是:

$xml = simplexml_load_file('file.xml');
$contents = $xml->node1

并调用节点对象

$contents = $xml->node1->x

到目前为止似乎很好,问题是,如何在不提及节点名称的情况下调用对象“x”

您注意到我在上面添加的示例有 2 个节点

从中调用 x 我应该提到 nodename 然后 x

我想从整个 XML 中调用所有“x”

这怎么可能?

4

1 回答 1

1

当您无需担心命名空间时,SimpleXMLElement::xpath() 就可以解决问题。如果您确实有命名空间...您将需要 SimpleXMLElement::registerXPathNamespace()。

<?php
$xml = <<<EOT
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<Node name="node1">
  <x x="x"/>
  <x x="xxx"/>
</Node>

<Node name="node2">
  <x x="xx"/>
  <x x="xxxx"/>
</Node>
</root>
EOT;

// Original question
$s = new SimpleXMLElement($xml);
$r = $s->xpath('//Node/x');
var_dump($r);

// Something about names
$r2 = $s->xpath('Node[@name]');
$names = array();
foreach($r2 as $elem){
  $names[] = "{$elem['name']}";
}
var_dump($names);

// RoseWarad's answer (more efficient than "something about names")
$r3 = $s->xpath('*/@name');
var_dump($r3);

?>
于 2012-05-30T20:28:10.187 回答