解析 XML 并在 PHP 中读取每个元素


parsing xml and read each element in php

我有一个来自API的XML输出

<?xml version='1.0' encoding='UTF-8'?>
<Response>
    <ReturnRow Output1="11" Output2="12" Output3="13" Output4="14" Output5="15" />
    <ReturnRow Output1="21" Output2="22" Output3="23" Output4="24" Output5="25" />
    <Messages>
        <Message Code="INFO" Msg="Your request is successful." Type="APP"/>
    </Messages>       
</Response>

我正在尝试使用 PHP 解析上述 xml,循环子元素ReturnRown并回显Output1Output2到 HTML 表中。

这是我目前的代码:

$doc = new DOMDocument();
$doc->loadXML($test); //$test is holding the above XML
$node = $doc->getElementsByTagName( "ReturnRow" );
foreach ($node as $book) {
     var_dump($book);
}

但以上实际上并没有给我Ouput1Output2等的值。

我错过了什么或做错了什么?

我上面的PHP代码的结果:

object(DOMElement)#3 (18) { ["tagName"]=> string(9) "ReturnRow" ["schemaTypeInfo"]=> NULL        ["nodeName"]=> string(9) "ReturnRow" ["nodeValue"]=> string(0) "" ["nodeType"]=> int(1)     ["parentNode"]=> string(22) "(object value omitted)" ["childNodes"]=> string(22) "(object value omitted)" ["firstChild"]=> NULL ["lastChild"]=> NULL ["previousSibling"]=> string(22) "(object value omitted)" ["nextSibling"]=> string(22) "(object value omitted)" ["attributes"]=> string(22) "(object value omitted)" ["ownerDocument"]=> string(22) "(object value omitted)" ["namespaceURI"]=> NULL ["prefix"]=> string(0) "" ["localName"]=> string(9) "ReturnRow" ["baseURI"]=> string(20) "file:///W:/ischools/" ["textContent"]=> string(0) "" } object(DOMElement)#5 (18) { ["tagName"]=> string(9) "ReturnRow" ["schemaTypeInfo"]=> NULL ["nodeName"]=> string(9) "ReturnRow" ["nodeValue"]=> string(0) "" ["nodeType"]=> int(1) ["parentNode"]=> string(22) "(object value omitted)" ["childNodes"]=> string(22) "(object value omitted)" ["firstChild"]=> NULL ["lastChild"]=> NULL ["previousSibling"]=> string(22) "(object value omitted)" ["nextSibling"]=> string(22) "(object value omitted)" ["attributes"]=> string(22) "(object value omitted)" ["ownerDocument"]=> string(22) "(object value omitted)" ["namespaceURI"]=> NULL ["prefix"]=> string(0) "" ["localName"]=> string(9) "ReturnRow" ["baseURI"]=> string(20) "file:///W:/ischools/" ["textContent"]=> string(0) "" }

在您的情况下,我更喜欢使用 simplexml,因为它可以以易于迭代的格式返回节点的所有属性,并使用 xpath 查找您感兴趣的节点:

$xml = '<'.'?xml version="1.0" encoding="UTF-8"?>
<Response>
    <ReturnRow Output1="11" Output2="12" Output3="13" Output4="14" Output5="15" />
    <ReturnRow Output1="21" Output2="22" Output3="23" Output4="24" Output5="25" />
    <Messages>
        <Message Code="INFO" Msg="Your request is successful." Type="APP"/>
    </Messages>
</Response>
';
$doc = simplexml_load_string($xml);
$node = $doc->xpath('//ReturnRow');
foreach ($node as $book) {
    foreach ($book->attributes() as $name => $value) {
        var_dump((string)$name, (string)$value);
    }
}

如果你的输入始终具有这些属性,你可以在原始代码的循环中使用 DOMNode 的 getAttribute() 方法来获取值:

foreach ($node as $book) {
    var_dump($book->getAttribute('Output1'), $book->getAttribute('Output2'));
}