2016-04-11 5 views
1

Казаться быть страдавшая захвата поля «администратора» под контактного типаАнализировать XML Дом с PHP

<epp:epp xmlns:epp="urn:ietf:params:xml:ns:epp-1.0"> 
<epp:response> 
<epp:result code="1000"> 
    <epp:msg>Domain Info Command completed successfully</epp:msg> 
</epp:result> 
<epp:resData> 
    <domain:infData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"> 
    <domain:name>exampledomain.com</domain:name> 
    <domain:roid>DOM_1E-PDT</domain:roid> 
    <domain:status s="ok"/> 
    <domain:registrant>exampleregistrant</domain:registrant> 
    <domain:contact type="admin">admincontact</domain:contact> 
    <domain:contact type="tech">techcontact</domain:contact> 
    <domain:contact type="billing">billingcontact</domain:contact> 
    <domain:contact type="reseller">resellercontact</domain:contact> 

код, я попытался было:

$adminid = $doc->getElementsByTagName('admin')->item(0)->nodeValue; 

Любая помощь приветствуется.

+0

ли другие поля работают с тем же кодом, то? Как именно вы загружаете в '$ doc'? В какой тип вы его включили? Это определенно имеет значение. - а также какие ошибки вы получаете? – NoobishPro

+1

«admin» - это не имя тега, это атрибут. – fusion3k

ответ

0

В узле <domain:contact type="admin"> «admin» не является узлом. Это значение атрибута «тип» (узла < домена: контакт >).

Итак, чтобы получить его значение узла, вам нужно найти элемент с тегом TagName = "domain: contact" и атрибутом "type = admin".

Двоеточие в названии тега обозначает узел с именами: вы не можете его искать просто с помощью ->getElementsByTagName('domain:contact'), вы также должны указать относительный URI именного пространства. Вы можете найти NamespaceURI у одного из предков узлов, в атрибуте, указанном xmlns:, за которым следует префикс тега Namespace (в вашем случае domain).

В вашем XML, NamespaceURI в:

<domain:infData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"> 
<!--   └─┬─┘ └─┬──┘ └──────┬────────────────────────┘ 
NS declaration prefix NS prefix NameSpace URI 

Чтобы найти Namespaced элемент, вы можете использовать этот синтаксис:

$nodes = $doc->getElementsByTagNameNS('urn:ietf:params:xml:ns:domain-1.0', 'contact'); 
foreach($nodes as $node) 
{ 
    if('admin' == $node->getAttribute('type')) $adminid = $node->nodeValue; 
} 

В противном случае, вы можете использовать DOMXPath:

$xpath = new DOMXPath($doc); 
$xpath->registerNameSpace('d', 'urn:ietf:params:xml:ns:domain-1.0'); 
#       ┌┘ 
$nodes = $xpath->query('//d:contact[@type="admin"]'); 
$adminid = $found->item(0)->nodeValue; 

Как вы можете видеть, вы можете использовать любой псевдоним, чтобы ссылаться на префикс NameSpace, не обязательно реальный префикс (In above exa mple, я использую 'd' вместо 'domain').

0

Вот еще одно решение:

$rawXml = 
<<<XML 
    <epp:epp xmlns:epp="urn:ietf:params:xml:ns:epp-1.0"> 
     <epp:response> 
      <epp:result code="1000"> 
       <epp:msg>Domain Info Command completed successfully</epp:msg> 
      </epp:result> 
      <epp:resData> 
       <domain:infData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"> 
        <domain:name>exampledomain.com</domain:name> 
        <domain:roid>DOM_1E-PDT</domain:roid> 
        <domain:status s="ok"/> 
        <domain:registrant>exampleregistrant</domain:registrant> 
        <domain:contact type="admin">admincontact</domain:contact> 
        <domain:contact type="tech">techcontact</domain:contact> 
        <domain:contact type="billing">billingcontact</domain:contact> 
        <domain:contact type="reseller">resellercontact</domain:contact> 
       </domain:infData> 
      </epp:resData> 
     </epp:response> 
    </epp:epp> 
XML; 



$xmlDoc = new SimpleXMLElement($rawXml); 

$xmlDoc->registerXPathNamespace('domain', 'urn:ietf:params:xml:ns:domain-1.0'); 
echo $xmlDoc->xpath('//domain:contact[@type="admin"]')[0]; 
Смежные вопросы