好的xpath但没有PHP的结果

时间:2014-01-05 21:51:20

标签: php xml xpath

我写了以下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可以帮助我吗?

非常感谢!

1 个答案:

答案 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');

然后它对我来说很好。