2

我有以下 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(只是第一个元素的名称)。

4

1 回答 1

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 元素,那么它的值也会返回,这是不需要的。

希望有帮助

于 2013-01-31T12:26:21.403 回答