我正在尝试解析来自其他服务器的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
指向的名称空间,并将其与目标标签名称一起传递给方法,例如roid
或name
。
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的东西,我认为这就是您可以使用名称空间的地方。
很抱歉,我不能提供进一步的帮助,但由于没有人提到名称空间,我想我无论如何都会添加答案。也许它会帮助你在谷歌上寻找答案。