通过SimpleXMLElement和XPath(PHP)访问元素

时间:2013-01-12 09:46:15

标签: php xml xpath simplexml

  

可能重复:
  A simple program to CRUD node and node values of xml file
  XPath and PHP: nothing works properly

$XML = <<<XML
<items>
    <item id="123">
        <name>Item 1</name>
    </item>
    <item id="456">
        <name>Item 2</name>
    </item>
    <item id="789">
        <name>Item 3</name>
    </item>
</items>
XML;

$objSimpleXML = new SimpleXMLElement($XML);

echo $objSimpleXML->item[2]->name; // output: Item 3 (OK)
echo '<br><pre>';
print_r($objSimpleXML->xpath('./item[1]/name')); // output: empty Array!!!

您好!如何使用纯xpath查询将“Item 3”作为输出? (我的提议输出一个空数组。)

1 个答案:

答案 0 :(得分:1)

这是因为xpath集合索引是基于1的,与我们最熟悉的基于0的数组相对。

使用纯xpath查询获取Item 3不可能是xpath function returns array。您必须先存储结果并使用数组索引来访问该元素。

$item = $objSimpleXML->xpath('./item[3]/name');
$str = $item[0];

从W3C的XPATH 1.0 spec,这些被称为predicate

  

轴是前轴或倒轴。仅包含上下文节点或文档顺序中的上下文节点之后的节点的轴是前向轴。仅包含文档顺序中上下文节点之前的上下文节点的轴是反向轴。因此,祖先,祖先或自我,先前和前兄弟轴是反向轴;所有其他轴都是前轴。由于自轴总是包含至多一个节点,因此它是正向轴还是反向轴没有区别。节点集的成员相对于轴的接近位置被定义为如果轴是前向轴,则按照文档顺序排序的节点集中的节点的位置,并且如果是轴,则按逆向文档顺序排序是一个反向轴。 第一个位置是1