【问题标题】:PHP XML Libraries Not Returning XPath ResultsPHP XML 库不返回 XPath 结果
【发布时间】:2011-02-15 12:40:53
【问题描述】:

我正在尝试使用 PHP 和 XPath 从该 XML 中获取 ID 元素为 1364 的所有类别节点:http://education.oracle.co.uk/html/oracle/28US/schedule.xml

我的代码目前看起来像这样:

$schedule = new SimpleXMLElement("schedule.xml", null, true);
$nodes = $schedule->xpath("//category[id=1364]");
if(!$nodes) {
    echo "No xpath results.";
} else {
    echo count($nodes)." results.";
}

XPath 不返回任何结果。我已经使用其他XPath查询程序检查了查询,并返回了结果。

上面的代码使用了 SimpleXML,但是我在使用 DOMDocument 时遇到了完全相同的问题。在 SimpleXML 和 DOMDocument 中,运行“//*”的 XPath 都可以,返回文档中的所有节点。

谢谢!

【问题讨论】:

    标签: php xml xpath simplexml domdocument


    【解决方案1】:

    胡乱猜测,这是一个命名空间问题

    您的 XML 文档可能包含类似的内容

    <root xmlns="http://some.uri">
        <category id="1364"/>
    </root>
    

    因为&lt;category&gt; 在默认命名空间中,它没有任何前缀,但为了让您的 XPath 工作,您还需要将此命名空间绑定到某个前缀,然后在 XPath 表达式中使用该前缀。

    $schedule->registerXPathNamespace("ns", "http://some.uri");
    $nodes = $schedule->xpath('//ns:category[id=1364]');
    

    没有命名空间前缀的 XPath (1.0) 表达式始终只匹配无命名空间中的目标。

    【讨论】:

    • 更准确地说:“如果两个扩展名称具有相同的本地部分,并且它们都具有空命名空间 URI 或都具有相等的非空命名空间 URI,则它们是相等的。” w3.org/TR/xpath/#data-model
    • 将 XPath 设置为 //ns:category[ns:id=1364],它可以完美运行!
    猜你喜欢
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2012-11-21
    • 2013-11-15
    • 2018-01-21
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多