这是我用来解析远程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
答案 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