0

我正在尝试解析来自其他服务器的 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 对象并且没有错误。

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

4

3 回答 3

2

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

键盘演示

$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
于 2013-08-08T07:43:53.577 回答
-1

只需将您的网址放入 simple_load_file()

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

这是最简单的方法

于 2013-08-07T10:24:28.703 回答
-1

但 infData 不是你的 tagName。此 XML 使用名称空间(域是您的名称空间)。没有这方面的经验,所以我真的可以帮助你,然后提示在哪里看。getElementsByTagName 不起作用,您需要 DOMXPath 之类的东西,我认为您可以在其中使用名称空间做一些事情。

抱歉,我无法提供进一步的帮助,但由于没有人提到命名空间,我想我还是会添加答案。也许它会帮助你谷歌寻找答案。

于 2013-08-08T07:25:13.187 回答