如何使用DOMDocument解析xml名称空间并确保获取对象


How to parse xml namespaces with DOMDocument and be sure to get objects

我正在尝试解析来自其他服务器的xml响应。

我可以从xml中获得我需要的对象。但有时,有时,我拿不到一些东西。并且出现此错误。

致命错误:在第91行中对非对象调用成员函数getElementsByTagName()

我检查了每一件东西,我认为没有什么问题。

下面是一个xml响应示例:

 <epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:domain="http://epp.nic.ir/ns/domain-1.0">
<response xmlns:domain="http://epp.nic.ir/ns/domain-1.0">
    <result code="1000">
        <msg>Command completed successfully</msg>
    </result>
    <resData xmlns:domain="http://epp.nic.ir/ns/domain-1.0">
        <domain:infData xmlns:domain="http://epp.nic.ir/ns/domain-1.0">
            <domain:name>pooyaos.ir</domain:name>
                <domain:roid>305567</domain:roid>
                <domain:status s="serverHold"/>
                <domain:status s="irnicReserved"/>
                <domain:status s="serverRenewProhibited"/>
                <domain:status s="serverDeleteProhibited"/>
                <domain:status s="irnicRegistrationDocRequired"/>
                <domain:contact type="holder">pe59-irnic</domain:contact>
                <domain:contact type="admin">pe59-irnic</domain:contact>
.
.
and more...

我正在尝试获取这个对象domain:infData

我认为错误来自这一部分。

当我试图获取这个对象时,domdocument返回null。

php代码:

function DinfData()
    {
        $data = $this->dom->getElementsByTagName("infData")->item(0);
91:     $name = $data->getElementsByTagName("name")->item(0)->nodeValue;
        $roid = $data->getElementsByTagName("roid")->item(0)->nodeValue;
        $update = $data->getElementsByTagName("upDate")->item(0)->nodeValue;
        $crdate = $data->getElementsByTagName("crDate")->item(0)->nodeValue;
        $exdate = $data->getElementsByTagName("exDate")->item(0)->nodeValue;
and more...

我把第91行标错了。

谢谢。。。。

编辑

$this->dom是我的DOMDocument对象,没有错误。

如果没有什么问题,有没有更好的方法来获取元素?

您需要使用DOMDocument::getElementsByTagNameNS(),它用于名称空间元素。找到domain指向的名称空间,并将其与目标标签名称一起传递给方法,例如roidname

Codepad演示

$dom = new DOMDocument();
$dom->loadXML($xml);
$ns = 'http://epp.nic.ir/ns/domain-1.0';
$data = $dom->getElementsByTagNameNS($ns, 'infData')->item(0);
$roid = $data->getElementsByTagNameNS($ns, 'roid')->item(0)->nodeValue;
$name = $data->getElementsByTagNameNS($ns, 'name')->item(0)->nodeValue;
// repeat the same for others
echo $roid . "'n";
echo $name;

输出

305567
pooyaos.ir

只需将您的url放入simple_load_file()

<?php
$xml = simplexml_load_file($xmlfile);
print $xml->infData;   // Sample content
?> 

这是一种最简单的方法

但是infData不是您的tagName。此XML使用名称空间(域是您的名称空间)。没有这方面的经验,所以我真的可以帮你做任何进一步的事情,然后提示你去哪里看。getElementsByTagName不起作用,您需要类似于DOMXPath的东西,我认为这就是您可以使用名称空间的地方。

很抱歉,我不能提供进一步的帮助,但由于没有人提到名称空间,我想我无论如何都会添加答案。也许它会帮助你在谷歌上寻找答案。