为什么在这里添加element.getAttribute()使我的php脚本返回错误500?

时间:2012-11-26 14:28:48

标签: php xml xmldom

这是我用来解析远程XML的代码:

$xmlDoc = new DOMDocument();
$xmlDoc->load("http://www.bnr.ro/nbrfxrates.xml");

$x = $xmlDoc->documentElement;
foreach ($x->childNodes AS $item)
{
    if($item->nodeName == 'Body')
        foreach ($item->childNodes AS $body_item)
        {
            if($body_item->nodeName == 'Cube')
                foreach ($body_item->childNodes AS $cube_item)
                {                                                   
                    print " - ".$cube_item->nodeName . " : ".$cube_item->getAttribute("currency")." = ". $cube_item->nodeValue . "<br>";

                }


        }
}

如果我删除了getAttribute部分,脚本运行顺利,但添加它会导致它返回错误500.

如果要查看xml,可以在地址找到。

启动错误报告后,我发现错误为:Object of class DOMText could not be converted to string

1 个答案:

答案 0 :(得分:2)

问题是childNodes正在提供常规节点和文本节点。您只能在常规Element节点(类型1)上调用getAttribute()。首先检查它们不是文本节点,然后再执行print

foreach ($body_item->childNodes AS $cube_item)
{
   // Only attempt to print the regular DOM elements                          
   if ($cube_item->nodeType == 1)
   {
     print " - ".$cube_item->nodeName . " : ".$cube_item->getAttribute("currency")." = ". $cube_item->nodeValue . "<br>";
   }
}

如果您在foreach循环中检查了每个nodeType的{​​{1}},那么您很可能会看到与空格的交替childNodes相似的内容文本和常规元素节点,当你真的只想要元素节点(3 1 3 1 3 1

MDN has a reference list of DOM node types

顺便说一句,使用完整代码快速验证修复程序会产生:

1