Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php从XML(包括子项)获取数据并显示在页面中_Php_Xml_Xml Parsing_Xmlreader - Fatal编程技术网

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

使用php从XML(包括子项)获取数据并显示在页面中,php,xml,xml-parsing,xmlreader,Php,Xml,Xml Parsing,Xmlreader,我有一个具有以下结构的XML: <item> <attributes> <attribute datatype="text"> <name><![CDATA[name]]></name> <value><![CDATA[Product Name]]>

我有一个具有以下结构的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>
但是使用下面的代码,我获取属性节点下的全部细节,但是我不能分离子节点值

$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 />";

    }
}

但这也同时显示了所有的子节点…我想将它们分离并存储到数据库中…请帮我解决这个问题…我一直在努力解决这个问题,使用
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);

我不熟悉XMLReader类,但您能再次调用扩展函数以更深一层吗?@scrowler…我对此也不太熟悉…我使用XMLReader,因为文件太大,XMLReader是读取此类文件的最佳选项。您能在if语句中再次调用扩展函数以更深一层吗?您可能会考虑更改使用SimeXML或DOMBODE,它们也是本地的。PHP@scrowler...any知道如何在这里使用DOMDocument吗?@scrowler…请查看我在帖子中的编辑。。。
$xml = new DOMDocument(); 
$xml->load('test.xml');
$root = $xml->documentElement;
foreach($root->childNodes as $node){

    //print $node->nodeName.' - '.$node->nodeValue;
    print $node->nodeValue;
}
$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);