从XML中获取数据。孩子们并使用php在页面中显示

时间:2015-04-23 08:52:32

标签: php xml xml-parsing xmlreader

我有一个具有以下结构的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;
}

但是这也显示了所有的子节点......我想将它们隔离并存储到DB中...请帮助我...这个安静很长时间挣扎

1 个答案:

答案 0 :(得分:2)

使用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);