PHP,XPath和SimpleXML - XPath无法正常工作

时间:2013-01-31 12:25:16

标签: php xml xml-parsing

我有以下PHP和XML:

$XML = <<<XML
<items>
    <item id="12">
        <name>Item A</name>
    </item>
    <item id="34">
        <name>Item B</name>
    </item>
    <item id="56">
        <name>Item C</name>
  </item>
</items>
XML;


$simpleXmlEle = new SimpleXMLElement($XML);

print_r($simpleXmlEle->xpath('./item[1]'));
print "- - - - - - -\n";
print_r($simpleXmlEle->xpath('./item[2][@id]'));
print "- - - - - - -\n";
print_r($simpleXmlEle->xpath('./item[1]/name'));

我可以像这样访问ID

$simpleXmlEle->items->item[0]['id']

由于它是一个动态应用程序,xpath在运行时作为字符串提供,所以我相信我应该使用xpath。

以上PHP产生:

PHP:

Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [id] => 12
                )

            [name] => Item A
        )

)
- - - - - - -
Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [id] => 34
                )

            [name] => Item B
        )

)
- - - - - - -
Array
(
    [0] => SimpleXMLElement Object
        (
        )

)

我理解第一个输出,但在第二个输出中,返回整个元素而不是仅返回属性。
1)有什么想法?

最后一项也是空的 2)为什么这是正确的xpath?

我的目标是第二和第三输出为:34(第二元素的id属性的值)项目A(只是第一个元素的名称)。

1 个答案:

答案 0 :(得分:2)

见下文:

// name only
$name = $simpleXmlEle->xpath("./item[1]/name");
echo $name[0], PHP_EOL;

// id only
$id = $simpleXmlEle->xpath("./item[2]/@id");
echo $id[0], PHP_EOL;

打印:

Array ( [0] => SimpleXMLElement Object ( [0] => Item A ) )
Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 34 ) ) )

确保不要执行:

print_r($objSimpleXML->xpath("//item[1]/name"));

根据文档//返回具有此名称的所有元素,因此如果在更深层次上有一个item元素,那么它的值也会被返回,这是不可取的。

希望有所帮助