2016-04-11 11 views
1

Scheinen um ein Problem zu sein, die das Feld "admin" unter Kontakttyp erfassenParse XML Dom mit 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> 

-Code habe ich versucht war:

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

Jede Hilfe sehr geschätzt.

+0

Sind die anderen Felder mit dem gleichen Code arbeiten, dann? Wie genau laden Sie in '$ doc'? Aus welchem ​​Typ hast du es gemacht? Das ist definitiv wichtig. - Welche Fehler bekommst du auch? – NoobishPro

+1

"admin" ist kein Tag-Name, es ist ein Attribut. – fusion3k

Antwort

0

Im Knoten <domain:contact type="admin"> ist "admin" kein Knoten. Dies ist der Wert des Attributs "type" (des Knotens < domain: contact >).

Um also seinen Knotenwert abzurufen, müssen Sie nach einem Element mit TagName = "domain: contact" und dem Attribut "type = admin" suchen.

Der Doppelpunkt im Tag-Name bezeichnet einen NameSpaced-Knoten: Sie können nicht einfach mit ->getElementsByTagName('domain:contact') suchen, Sie müssen auch relative NameSpace URI angeben. Sie können NamespaceURI in einem der Knotenvorfahren in einem Attribut finden, das durch xmlns: gefolgt von einem Namespace-Tag-Präfix (in Ihrem Fall domain) gekennzeichnet ist.

In Ihrem XML, namespaceURI ist in:

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

ein Namespace Element zu finden, können Sie diese Syntax verwenden:

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

Andernfalls können Sie DOMXPath verwenden:

$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; 

Wie Sie sehen können, können Sie jeden Alias ​​verwenden, um auf das Präfix NameSpace zu verweisen, nicht das reelle Präfix (In obigem Beispiel) Ich benutze 'd' anstelle von 'domain'.

0

Hier ist eine andere Lösung:

$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];