【问题标题】:Good xpath but no result in PHP好的 xpath 但在 PHP 中没有结果
【发布时间】:2014-01-05 21:51:19
【问题描述】:

我写了以下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 查询的结果,但我尝试了很多东西,但我认为它不是来自那里。

有人可以帮帮我吗?

非常感谢!

【问题讨论】:

  • 似乎可以使用普通 DOM 在 PHP 中找到:eval.in/86074
  • 你的代码对我很好:eval.in/86076 - 错误可能不在 xpath 表达式中。

标签: php xml xpath


【解决方案1】:

首先,在您的示例 XML 中,最后缺少一个 &lt;/root&gt;,但我想这只是一个复制/粘贴错误。

您的代码中的问题是您没有将文件名放在引号中:

$xml = simplexml_load_file(test.xml);

如果您执行echo hello; 之类的操作,PHP 会尝试通过将“hello”解释为字符串来进行补偿。但是,在您的情况下,它所做的是将其解释为 two 字符串:“test”和“xml”,因为 . 是字符串连接运算符。所以它会尝试打开“testxml”(如果你把“test”和“xml”放在一起,你会得到)而不是“test.xml”。

解决办法是:

$xml = simplexml_load_file('test.xml');

然后它对我来说效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    相关资源
    最近更新 更多