0

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

4

1 回答 1

2

问题是childNodes同时提供常规节点和文本节点。您只能调用getAttribute()常规元素节点(类型 1)。在执行之前先检查它们是否不是文本节点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每个 的childNodes,您很可能会看到类似于3 1 3 1 3 1空白文本和常规元素节点交替出现的内容,而您只需要元素节点 ( 1)

MDN 有一个 DOM 节点类型的参考列表

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

 - Rate : AED = 0.9514<br>
 - Rate : AUD = 3.6518<br>
 - Rate : BGN = 2.3169<br>
 - Rate : BRL = 1.6787<br>
 - Rate : CAD = 3.5182<br>
 - Rate : CHF = 3.7628<br>
 - Rate : CNY = 0.5613<br>
 - Rate : CZK = 0.1790<br>
 - Rate : DKK = 0.6076<br>
 - Rate : EGP = 0.5726<br>
 - Rate : EUR = 4.5313<br>
 - Rate : GBP = 5.5990<br>
 - Rate : HUF = 1.6075<br>
 - Rate : INR = 0.0627<br>
 - Rate : JPY = 4.2601<br>
 - Rate : KRW = 0.3217<br>
 - Rate : MDL = 0.2836<br>
 - Rate : MXN = 0.2692<br>
 - Rate : NOK = 0.6169<br>
 - Rate : NZD = 2.8782<br>
 - Rate : PLN = 1.1019<br>
 - Rate : RSD = 0.0405<br>
 - Rate : RUB = 0.1127<br>
 - Rate : SEK = 0.5268<br>
 - Rate : TRY = 1.9469<br>
 - Rate : UAH = 0.4288<br>
 - Rate : USD = 3.4950<br>
 - Rate : XAU = 196.3192<br>
 - Rate : XDR = 5.3606<br>
 - Rate : ZAR = 0.3937<br>
于 2012-11-26T14:45:35.050 回答