gpt4 book ai didi

PHP simplexml : why does xpath stop working?

转载 作者:数据小太阳 更新时间:2023-10-29 01:40:52 25 4
gpt4 key购买 nike

供应商稍微更改了 XML header 后发生了一件奇怪的事情。我曾经能够使用 xpath 阅读内容,但现在我什至无法通过

获得回复
$xml->xpath('/');

他们改变了它...

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE NewsML SYSTEM "http://www.newsml.org/dl.php?fn=NewsML/1.2/specification/NewsML_1.2.dtd" [
<!ENTITY % nitf SYSTEM "http://www.nitf.org/IPTC/NITF/3.4/specification/dtd/nitf-3-4.dtd">
%nitf;
]>
<NewsML>
...

为此:

<?xml version="1.0" encoding="iso-8859-1"?>
<NewsML
xmlns="http://iptc.org/std/NewsML/2003-10-10/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://iptc.org/std/NewsML/2003-10-10/ http://www.iptc.org/std/NewsML/1.2/specification/NewsML_1.2.xsd http://iptc.org/std/NITF/2006-10-18/ http://contentdienst.pressetext.com/misc/nitf-3-4.xsd"
>
...

最佳答案

这很可能是因为他们在文档中引入了默认 namespace (xmlns="http://iptc.org/std/NewsML/2003-10-10/")。简单地说,SimpleXML 对默认命名空间的支持不是很好。

你能尝试显式注册一个命名空间前缀吗:

$xml->registerXPathNamespace("n", "http://iptc.org/std/NewsML/2003-10-10/");
$xml->xpath('/n:NewsML');

您必须调整您的 XPath 表达式以在每个 元素上使用“n:” 前缀。这是一些附加信息:http://people.ischool.berkeley.edu/~felix/xml/php-and-xmlns.html .

编辑:根据 the spec :

The registerXPathNamespace() function creates a prefix/ns context for the next XPath query.

这意味着必须在每个 XPath 查询之前调用它,因此包装 XPath 查询的函数将是很自然的事情:

function simplexml_xpath_ns($element, $xpath, $xmlns)
{
foreach ($xmlns as $prefix_uri)
{
list($prefix, $uri) = explode("=", $prefix_uri, 2);
$element->registerXPathNamespace($prefix, $uri);
}
return $element->xpath($xpath);
}

用法:

$xmlns = ["n=http://iptc.org/std/NewsML/2003-10-10/"];
$result = simplexml_xpath_ns($xml, '/n:NewsML', $xmlns);

关于PHP simplexml : why does xpath stop working?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/352052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com