从 XML 中获取数据,包括。子项并使用 php 在页面中显示

Fetching data from XML incl. children and display in page using php

我有一个 XML 结构如下:

<item>
                      <attributes>
                <attribute datatype="text">
                    <name><![CDATA[name]]></name>
                    <value><![CDATA[Product Name]]></value>
                </attribute>
                <attribute datatype="text">
                    <name><![CDATA[sku]]></name>
                    <value><![CDATA[PRODUCTSKU]]></value>
                </attribute>
                <attribute datatype="numeric">
                    <name><![CDATA[price]]></name>
                    <value>10000</value>
                </attribute>
        <attribute datatype="numeric">
                    <name><![CDATA[eancode]]></name>
                    <value>123456789</value>
                </attribute>
            </attributes>
        </item>

现在,我在这里寻找以下输出:

Product Name : PRODUCTSKU : 10000 : 123456789

但是使用以下代码获取 attribute 节点下的全部详细信息,但我无法分离 SUB NODES 值...

$reader = new XMLReader();
$reader->open( 'test.xml' );
$id = 'attributes';
while ($reader->read()) {
    if ($reader->nodeType == XMLReader::ELEMENT) {
        $exp = $reader->expand();
        if ($exp->nodeName == $id)
            echo "<b>" . $exp->nodeName . " : </b>" . $exp->nodeValue . "<br />";

    }
}

我也用 DOMDOcument 试过这个:

$xml = new DOMDocument(); 
$xml->load('test.xml');
$root = $xml->documentElement;
foreach($root->childNodes as $node){

    //print $node->nodeName.' - '.$node->nodeValue;
    print $node->nodeValue;
}

但这也会将所有子节点一起显示...我想将它们分开并存储到数据库中...请帮我解决这个问题...我很长时间都在努力解决这个问题

使用 SimpleXML 更容易,但如果您想使用 XMLReader 试试这个:

$values = array();
$reader = new XMLReader();
$reader->open( 'test.xml' );
$id = 'attribute';
while ($reader->read()) {
    if ($reader->nodeType == XMLReader::ELEMENT) {
        $exp = $reader->expand();
        if ($exp->nodeName == "item") {
            if (count($values)) print implode(" : ", $values);
            $values = array();
        }
        if ($exp->nodeName == $id) {
            foreach ($exp->childNodes as $node) {
                if ($node->nodeName == "value") {
                    $values[] = $node->textContent;
                }
            }
        }
    }
}
if (count($values)) print implode(" : ", $values);