gpt4 book ai didi

php - SimpleXML 访问带命名空间的节点和不带命名空间的子节点

转载 作者:行者123 更新时间:2023-12-03 08:55:34 26 4
gpt4 key购买 nike

我正在尝试访问具有命名空间声明的节点中没有命名空间声明的节点列表。我的 XML 文件有一个带有命名空间 ehd 的主节点,在同一命名空间内有两个子节点 header、body。但是,主体节点内的所有子节点都没有进一步的 namespace 声明。我正在努力使用 SimpleXML 访问这些节点。

摘自 xml 文件:

<?xml version="1.0" encoding="ISO-8859-15"?>
<ehd:ehd ehd_version="1.40" xmlns:ehd="urn:ehd/001" xmlns="urn:ehd/go/001">
<ehd:header>
</ehd:header>
<ehd:body>
<gnr_liste>
<gnr V="01100"></gnr>
<gnr V="01101"></gnr>
<gnr V="01102"></gnr>
</gnr_liste>
</ehd:body>
</ehd:ehd>

我的代码如下:

$xml = simplexml_load_file($file) or die("Failed to load");   
$ehd = $xml->children('ehd', true)->body;
simplexml_dump($ehd);
$gnr_liste = $ehd->children('gnr_liste')->children('gnr');
simplexml_dump($gnr_liste);

输出为:

SimpleXML object (1 item)
[
Element {
Namespace: 'urn:ehd/001'
Namespace Alias: 'ehd'
Name: 'ehd'
String Content: ''
Content in Namespace ehd
Namespace URI: 'urn:ehd/001'
Children: 2 - 1 'body', 1 'header'
Attributes: 0
Content in Default Namespace
Children: 0
Attributes: 1 - 'ehd_version'
}
]
SimpleXML object (1 item)
[
Element {
Namespace: 'urn:ehd/001'
Namespace Alias: 'ehd'
Name: 'body'
String Content: ''
Content in Default Namespace
Namespace URI: 'urn:ehd/go/001'
Children: 1 - 1 'gnr_liste'
Attributes: 0
}
]

如何从 gnr_liste 节点访问所有 gnr 项?

注意:我正在使用simplexml_dump用于调试

最佳答案

->children() 的参数始终是命名空间标识符或本地前缀,而不是标记名称。如果这些元素位于“无命名空间”中,您可以使用 ->children('') 访问它们。

但是,本文档中没有前缀的元素没有命名空间 - 它们位于默认命名空间中,在本例中为urn:ehd/go/001(由 xmlns="urn:ehd/go/001" 定义)。

如果您使用完整的命名空间标识符而不是前缀(如果提要更改,前缀也不太可能中断),您应该能够轻松访问这些标识符:

$xml = simplexml_load_file($file) or die("Failed to load");   
$ehd = $xml->children('urn:ehd/001')->body;
$gnr_liste = $ehd->children('urn:ehd/go/001')->gnr_liste;
foreach ( $gnr_liste->gnr as $gnr ) {
simplexml_dump($gnr);
}

您可能想要为命名空间指定您自己的名称,这样您就不必使用完整的 URI,但也不依赖于生成 XML 时使用的前缀;一种常见的方法是定义常量:

const XMLNS_EHD_MAIN = 'urn:ehd/001';
const XMLNS_EHD_GNR = 'urn:ehd/go/001';

$xml = simplexml_load_file($file) or die("Failed to load");
$ehd = $xml->children(XMLNS_EHD_MAIN)->body;
$gnr_liste = $ehd->children(XMLNS_EHD_GNR)->gnr_liste;
foreach ( $gnr_liste->gnr as $gnr ) {
simplexml_dump($gnr);
}

关于php - SimpleXML 访问带命名空间的节点和不带命名空间的子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55641444/

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