2015-04-23 1 views
0

У меня есть XML со следующей структурой:Получение данных из XML вкл. дети и дисплей в страницу с помощью PHP

<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 

Но с помощью следующего кода я Fetching целые детали под атрибут узла, но я не могу отделить значения SUB уЗЛОВ ...

$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; 
} 

Но это также показывает все вложенные узлы вместе ... Я хочу, чтобы отделить их и хранить в БД ... Пожалуйста, помогите мне с этим ... утром борется с этой тихой долго

+0

Я не знаком с классом XMLReader, но вы можете вызвать функцию расширения снова идти уровень глубже? –

+0

@scrowler ... я также не очень хорошо знаком с этим ... использую XMLReader, так как файл слишком велик, а XMLReader - лучший вариант для чтения такого файла. – user3305327

+0

Можете ли вы вызвать функцию expand в вашем if-заявлении еще раз, чтобы перейти к уровень глубже? Возможно, вы захотите изменить использование SimpleXML или DOMDocument, которые также являются родными для PHP –

ответ

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); 
+0

@ 2kai ... большое спасибо – user3305327

Смежные вопросы