使用php从XML(包括子项)获取数据并显示在页面中
我有一个具有以下结构的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]]>
<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);