gpt4 book ai didi

php - 在 php 中使用 xpath 忽略命名空间

转载 作者:行者123 更新时间:2023-12-03 16:51:48 26 4
gpt4 key购买 nike

我想从 xml 文件中提取一些标签。 xml 文件可能是这样的:

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="de">
[... some more tags ...]
<page>
<title>Title 1</title>
[... some more tags ...]
</page>
<page>
<title>Title 2</title>
[... some more tags ...]
</page>
</mediawiki>

当我使用 https://www.freeformatter.com/xpath-tester.html拉“//标题”一切正常,我收到两个标题。

但是当我使用以下 php 时:

$xml = simplexml_load_file('articles.xml');
$result = $xml->xpath('//title');
var_dump($result);

结果数组为空。

我已经检查了很多类似的问题,发现如果我用相同的 URL 设置 registerXPathNamespace 就可以了。但是,我正在阅读的 XML 文件来自多个使用不同软件的外部来源(以上只是一个可能的示例)。他们可能随时改变。因此,每次打开 XML 时,我都需要读出 URL 并将其放入 registerXPathNamespace。使其工作的另一种选择是从 XML 中剥离 xmlns。如果我只想提取“title”(和其他一些)标签,而不管命名空间是什么,那么这两个选项似乎都非常复杂。

有没有简单的方法告诉 xpath 忽略命名空间?(如果没有办法忽略它:避免更改 URL 问题的最简单和持久的解决方案是什么?)

到目前为止,我使用的是硬编码

foreach ($xml->page as $page) {
$title = $page->title;
//[... do something ...]
}

哪个有效。但我认为 xpath 会很方便(更灵活、不是硬编码、更耐用)并想试一试。

最佳答案

您可以从文档中获取 namespace ,然后从中注册默认 namespace 。这有点痛苦,因为默认命名空间以一个空白键结尾,但这就是为什么从数组中获取第一个值然后使用它有点费力。

所以代码是这样的:

$xml = simplexml_load_file('articles.xml');
$ns = $xml->getDocNamespaces();
$xml->registerXPathNamespace('def', array_values($ns)[0]);
$result = $xml->xpath('//def:title');
var_dump($result);

关于php - 在 php 中使用 xpath 忽略命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45608671/

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