我写了以下xpath:
//datas[child::node()//DataInfo/DataInfoItem[contains(@Value,'EA22')]]
应用于以下XML:
<?xml version="1.0" encoding="utf-8"?>
<root>
<Customer Modified="false">
<datas>
<FireData>
<DataInfo>
<DataInfoItem Name="place" Value="g5688"/>
<DataInfoItem Name="number" Value="EA22"/>
<DataInfoItem Name="use" Value="ice"/>
</DataInfo>
<DataHistorics>
<DataHistoric HistoDate="2013-11-25T07:54:31" Type="0" visual="691.77"/>
<DataHistoric HistoDate="2013-12-02T07:23:29" Type="0" visual="618.65"/>
</DataHistorics>
<FireDataData Previous="106256.71"/>
</FireData>
</datas>
</Customer>
<Customer Modified="false">
<datas>
<FireData>
<DataInfo>
<DataInfoItem Name="place" Value="g5678"/>
<DataInfoItem Name="number" Value="GH44"/>
<DataInfoItem Name="use" Value="ice"/>
</DataInfo>
<DataHistorics>
<DataHistoric HistoDate="2013-11-25T07:54:31" Type="0" visual="691.77"/>
<DataHistoric HistoDate="2013-12-02T07:23:29" Type="0" visual="618.65"/>
</DataHistorics>
<FireDataData Previous="106256.71"/>
</FireData>
</datas>
</Customer>
我在线尝试了几个xpath测试器(http://www.xpathtester.com/,http://xpath.online-toolz.com/tools/xpath-editor.php)和Oxygen, 并且xpath始终返回我正在寻找的内容:
<datas>
<FireData>
<DataInfo>
<DataInfoItem Name="place" Value="g5688"/>
<DataInfoItem Name="number" Value="EA22"/>
<DataInfoItem Name="use" Value="ice"/>
</DataInfo>
<DataHistorics>
<DataHistoric HistoDate="2013-11-25T07:54:31" Type="0" visual="691.77"/>
<DataHistoric HistoDate="2013-12-02T07:23:29" Type="0" visual="618.65"/>
</DataHistorics>
<FireDataData Previous="106256.71"/>
</FireData>
</datas>
但如果我在php中这样做,我什么也得不到:
$xml = simplexml_load_file(test.xml);
$data = $xml->xpath("//datas[child::node()//DataInfo/DataInfoItem[contains(@Value,'EA22')]]");
var_dump($data)
我真的不明白,我在另一个讨论中读到var_dump不适合打印xpath查询的结果,但我尝试了很多东西而且我不认为它是从那里来的。
Anymone可以帮助我吗?
非常感谢!
答案 0 :(得分:0)
首先,在您的示例XML中,最后缺少</root>
,但我想这只是一个复制/粘贴错误。
代码中的问题是您没有将文件名放在引号中:
$xml = simplexml_load_file(test.xml);
如果您执行echo hello;
之类的操作,PHP会尝试通过将“hello”解释为字符串来进行补偿。但在你的情况下,它的作用是将其解释为 two string:“test”和“xml”,因为.
是字符串连接运算符。所以它会尝试打开“testxml”(如果你把“test”和“xml”放在一起就是你得到的)而不是“test.xml”。
修复将是:
$xml = simplexml_load_file('test.xml');
然后它对我来说很好。