访问XML文档中嵌套命名空间的属性

时间:2016-07-14 17:36:17

标签: 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 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>

在上面,我需要访问&#34; avail&#34;我可以收集的属性位于epp命名空间内的嵌套命名空间域中。

我使用simplexml_load_string($ xml)来访问属性。我能够访问epp命名空间,但是我缺乏XML知识使我失败了:)

提前谢谢!

修改

由于问题被标记为重复,我想清除我正在寻找位于嵌套命名空间内的属性的值。

我试图通过xpath访问该属性,但只接收到未定义的名称空间前缀错误:

 echo $data->xpath('/domain:name')->attributes()->avail;
 echo $data->xpath('/epp:response/epp:resData/domain:chkData/domain:cd/domain:name')->attributes()->avail;

我也尝试了上面没有epp命名空间但结果相同的情况。我知道如何从单个命名空间获取值,而不是从嵌套命名空间获取值。

另一个编辑:

我还在苦苦挣扎。我真的无法获取xpath来查找xml文档中的关联命名空间元素。以下代码是我正在尝试的。

我试图在$ sxe-&gt; xpath(&#39; // d:name&#39;)上做一个vardump但是得到一个空数组,表示没有值?

请有人可以帮助兄弟:)

  $sxe = simplexml_load_string($result, "SimpleXMLElement", 0, "epp", true);
  $code = $sxe->response->result->attributes()->code;
  if ($code == 1000) {
       $sxe->registerXPathNamespace('d','ietf:params:xml:ns:domain-1.0');
       echo $sxe->xpath('//d:name')->attributes()->avail;
  }
  exit;

另一个编辑

在另一个答案后,我改变了我的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;

0 个答案:

没有答案