Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php XML文档中嵌套命名空间的访问属性_Php_Xml - Fatal编程技术网

Php 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文档中嵌套命名空间中的属性的值。以下是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 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;