【发布时间】:2015-08-10 02:29:47
【问题描述】:
我已经搜索过这个,我找到的答案似乎说出了我认为我理解的内容。显然我错过了一些东西。我对 xPath 查询的结果感到困惑。我已经简化了我的问题,以便在此处发布一个测试用例。
我的真实 xml 有几个不同深度的数据集节点。最终,我想获取具有给定标签的每个数据集元素,然后遍历该标签并获取字段值(在不同的位置(或深度),所以我认为我需要 xpath)。我可以使用 xpath 来成功获取我想要的数据集元素。但是,当我在该结果对象上运行 xpath 时,它会得到我想要的字段以及所有其他字段。我不明白为什么它不仅返回 field1、field2 和 field3。当我 print_r($value[0]) 时,它只显示我想要的字段。但是,当我在 $value[0] 上运行 xpath 时,它会返回 xml 文档中的所有字段。
示例 XML
<myxml>
<dataset label="wanteddata" label2="anotherlabel">
<dataitem>
<textdata>
<field label="label1">field1</field>
<field label="label2">field2</field>
<field label="label3">field3</field>
</textdata>
</dataitem>
</dataset>
<dataset label="unwanteddata" label2="unwantedanotherlabel">
<dataitem>
<textdata>
<field label="label4">field4</field>
<field label="label5">field5</field>
<field label="label6">field6</field>
</textdata>
</dataitem>
</dataset>
</myxml>
这里是测试代码。
$xmlstring = file_get_contents('simplexml_test.xml');
$xml = simplexml_load_string($xmlstring);
if ($xml === false) {
throw new Exception("Failed to load");
}
$value = $xml->xpath('//dataset[@label="wanteddata"]');
print_r($value[0]->xpath('//field'));
代码输出:
Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[label] => label1
)
)
[1] => SimpleXMLElement Object
(
[@attributes] => Array
(
[label] => label2
)
)
[2] => SimpleXMLElement Object
(
[@attributes] => Array
(
[label] => label3
)
)
[3] => SimpleXMLElement Object
(
[@attributes] => Array
(
[label] => label4
)
)
[4] => SimpleXMLElement Object
(
[@attributes] => Array
(
[label] => label5
)
)
[5] => SimpleXMLElement Object
(
[@attributes] => Array
(
[label] => label6
)
)
)
【问题讨论】: