2013-09-16 2 views
1

В настоящее время я пытаюсь создать общий PHP-класс, позволяющий извлекать XML-данные. Все данные поступают в одинаковом формате, но будут иметь разные имена элементов, а иногда может быть больше элементов. Пример XML:Получение содержимого элемента XML без знания имени элемента PHP

Один канал может показать это:

<GroupData> 
    <Table diff:id="1"> 
     <Code>1</Code> 
     <Name>Red</Name> 
     <Type>X</Type> 
    </Table> 
    <Table diff:id="2"> 
     <Code>2</Code> 
     <Name>Yellow</Name> 
     <Type>Y</Type> 
    </Table> 
</GroupData> 

Другой канал может показать:

<GroupData> 
    <Table diff:id="1"> 
     <Code>1</Code> 
     <Name>Red</Name> 
    </Table> 
    <Table diff:id="2"> 
     <Code>2</Code> 
     <Name>Yellow</Name> 
    </Table> 
</GroupData> 

Мой PHP выглядит следующим образом:

$dom = DOMDocument::loadXML($xml); 

$node_list = $dom->getElementsByTagName('Table'); 

for($i=0; $i < $node_list->length; $i++) { 

    echo $node_list->item($i)->nodeValue; 

} 

Это возвращает данные, но это не совсем то, что я ищу. Я бы хотел, чтобы он разбился, чтобы я мог видеть имя элемента и значение элемента, а затем создать массив из данных для будущего использования. Есть ли способ сделать это без использования «getElementsByTagName», что я использовал раньше, чтобы получить XML? Я знаю, что каждая подача, которую я получаю, будет иметь таблицу, поэтому я могу ее прокручивать каждый раз. Спасибо за помощь.

+0

попробовать http://php.net/manual/en/domxpath.query.php и использовать селектор вправо –

ответ

2

getElementsByTagName() подходит. Код должен выглядеть следующим образом:

$doc = new DOMDocument(); 
$doc->loadXML($xml); 

$tables = $doc->getElementsByTagName('Table'); 
$data = array(); 
foreach($tables as $table) { 
    $id = $table->getAttribute('id'); 
    $record = array(); 
    foreach($table->childNodes as $child) { 
     if($child->nodeType === XML_ELEMENT_NODE) { 
      $record[$child->nodeName] = $child->nodeValue; 
     } 
    } 
    $data[$id] = $record; 
} 

var_dump($data); 

код создает многомерный массив, где индекс первого измерения являются табличные идентификаторы и второго измерения являются массивы, имеющие пары ключ/значение из XML. Я немного упростил его и сбросил префиксы пространства имен diff: для этого примера, так как они неверны (не зарегистрированы) в приведенных фрагментах. В коде реального мира вам понадобится getAttributeNS('diff', 'id').

Это даст вам:

array(2) { 
    [1] => 
    array(3) { 
    'Code' => 
    string(1) "1" 
    'Name' => 
    string(3) "Red" 
    'Type' => 
    string(1) "X" 
    } 
    [2] => 
    array(3) { 
    'Code' => 
    string(1) "2" 
    'Name' => 
    string(6) "Yellow" 
    'Type' => 
    string(1) "Y" 
    } 
} 
+0

Замечательно, что работал лакомство! Спасибо!! – 30secondstosam

+0

добро пожаловать! :) Возьмите также заботу о том, что я сказал об этом пространстве имен 'diff:' – hek2mgl

+0

действительно - спасибо. – 30secondstosam

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