Php XML文档中嵌套命名空间的访问属性
我需要访问位于XML文档中嵌套命名空间中的属性的值。以下是XML的一个示例:Php XML文档中嵌套命名空间的访问属性,php,xml,Php,Xml,我需要访问位于XML文档中嵌套命名空间中的属性的值。以下是XML的一个示例: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <epp:epp xmlns:epp="urn:ietf:params:xml:ns:epp-1.0"> <epp:response> <epp:result code="1000"> <epp:msg>Domain
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<epp:epp xmlns:epp="urn:ietf:params:xml:ns:epp-1.0">
<epp:response>
<epp:result code="1000">
<epp:msg>Domain Check Command completed successfully</epp:msg>
</epp:result>
<epp:msgQ count="4" id="OTE-EPP-155DF5E824E-1BC86"/>
<epp:resData>
<domain:chkData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
<domain:cd>
<domain:name avail="1">example.com</domain:name>
</domain:cd>
</domain:chkData>
</epp:resData>
<epp:trID>
<epp:clTRID>123</epp:clTRID>
<epp:svTRID>456</epp:svTRID>
</epp:trID>
</epp:response>
</epp:epp>
我也尝试了上面没有epp名称空间的方法,但得到了相同的结果。我知道如何从单个名称空间获取值,但不知道如何从嵌套名称空间获取值
$sxe = simplexml_load_string($result,NULL,NULL,'urn:ietf:params:xml:ns:epp-1.0');
$sxe->registerXPathNamespace('epp', 'ietf:params:xml:ns:epp-1.0');
$sxe->registerXPathNamespace('domain', 'ietf:params:xml:ns:domain-1.0');
$code = $sxe->xpath('//epp:result')[0]->attributes()->code;
if ($code == 1000) {
print_r($sxe->xpath('domain:name'));
print_r($sxe->xpath('//domain:name'));
}
exit;
另一次编辑:
我还在挣扎。我确实无法让xpath在xml文档中找到关联的名称空间元素。下面的代码是我正在尝试的
我还尝试在$sxe->xpath('//d:name')上执行vardump,但得到一个空数组,表示没有值
请有人能帮一个兄弟吗:)
又一次编辑
根据另一个答案,我更改了simplexml_load_string()函数声明,并尝试声明2个xpath名称空间(感觉像是迄今为止最接近的名称空间)——我能够在epp名称空间中获得值,但在域名称空间中仍然没有运气
$sxe = simplexml_load_string($result,NULL,NULL,'urn:ietf:params:xml:ns:epp-1.0');
$sxe->registerXPathNamespace('epp', 'ietf:params:xml:ns:epp-1.0');
$sxe->registerXPathNamespace('domain', 'ietf:params:xml:ns:domain-1.0');
$code = $sxe->xpath('//epp:result')[0]->attributes()->code;
if ($code == 1000) {
print_r($sxe->xpath('domain:name'));
print_r($sxe->xpath('//domain:name'));
}
exit;
仅供参考:如果是重复的,我很抱歉,但是,我的查询与从上述文档中的域名称空间检索值有关。默认名称空间是epp,因此我不确定如何“切换”名称空间(或者如果我的逻辑合理):)别担心,我没有标记。最好留下这样的引用,以防将来有人发现这个问题,寻找上面提到的内容。仅供参考,您不能只键入
epp:response
,然后让它工作,因为名称空间前缀可以更改。真正标识标记的是名称空间URI。因此SimpleXML并没有普通XML那么有用,我真的不知道如何最好地解决这个问题。对于不熟悉XML的人来说,这感觉是一个相当复杂的场景。我已尝试使用registerXpPathNamespace注册这两个名称空间,我已经能够访问epp名称空间,但访问域名称空间却没有成功
$sxe = simplexml_load_string($result,NULL,NULL,'urn:ietf:params:xml:ns:epp-1.0');
$sxe->registerXPathNamespace('epp', 'ietf:params:xml:ns:epp-1.0');
$sxe->registerXPathNamespace('domain', 'ietf:params:xml:ns:domain-1.0');
$code = $sxe->xpath('//epp:result')[0]->attributes()->code;
if ($code == 1000) {
print_r($sxe->xpath('domain:name'));
print_r($sxe->xpath('//domain:name'));
}
exit;