【问题标题】:PHP SimpleXML xpath query resultsPHP SimpleXML xpath 查询结果
【发布时间】: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
            )
    )
)

【问题讨论】:

    标签: php xml xpath simplexml


    【解决方案1】:

    //field 选择整个 XML 文档中的所有 &lt;field&gt; 元素,而不管您从哪个上下文节点调用该 XPath。要使 XPath 注意到上下文节点,您需要在 XPath 的开头添加一个点 (.)。在 XPath 中,(.) 引用当前上下文节点:

    print_r($value[0]->xpath('.//field'));
    

    【讨论】:

    • 那么来自 xpath 的第一个结果并不会将我限制在 xml 文档中的那个节点上吗?我仍在使用主要的原始文档?我认为 $value[0] 将只包含并有权访问该数据集元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2012-01-02
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多