【问题标题】:Parse XML Dom with PHP用 PHP 解析 XML Dom
【发布时间】:2016-04-11 20:49:39
【问题描述】:

似乎在捕获联系人类型下的“管理员”字段时遇到问题

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

任何帮助表示赞赏。

【问题讨论】:

  • 那么其他字段是否使用相同的代码?你究竟是如何加载$doc 的?你把它变成什么类型​​的?这绝对很重要。 - 还有,你遇到了什么错误?
  • “admin”不是标签名,是属性。

标签: php xml dom xml-parsing


【解决方案1】:

在节点&lt;domain:contact type="admin"&gt;中,“admin”不是节点。它是(节点的)属性“type”的值。

因此,要检索其节点值,您必须查找具有 TagName=“domain:contact” 和属性“type=admin”的元素。

标签名称中的冒号表示一个 NameSpaced 节点:您不能简单地使用-&gt;getElementsByTagName( 'domain:contact' ) 搜索它,您还必须指定相对的 NameSpace URI。您可以在一个节点祖先中找到 NamespaceURI,该属性由 xmlns: 标识,后跟命名空间标记前缀(在您的情况下为 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 前缀,而不需要真正的前缀(在上面的示例中,我使用 'd' 而不是 'domain')。

【讨论】:

    【解决方案2】:

    这是另一个解决方案:

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

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 2010-12-25
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 2012-11-18
      • 2012-01-10
      • 1970-01-01
      相关资源
      最近更新 更多