PHP – Как разобрать этот xml?

Я пытаюсь проанализировать XML ниже, так что я завершаю массив, который выглядит как образец включен … Мне сложно определить, как получить атрибуты внутри тегов для вывода, как я хочу это …

XML

<cust rid="999999" memberid="12345" lname="Doe" fname="John"> <address memberid="12345" address1="1234 Mockingbird Lane" address2="" city="Oakland" state="CA" zip="91111" country="United States"/> <phone memberid="12345" phonenumber="415.555.1212" countrycodeid="1" phonetype="Mobile"/> <custcode memberid="12345" ccode="Silver" deleted=”1”/> <custcode memberid="12345" ccode="Gold"/> </cust> 

Массив, который я хочу: Обратите внимание на элементы добавленного массива

 Array [cust] => Array [rid] => 999999 [member_id] => 12345 [lname] => Doe [fname] => John [address] => Array [0] => Array [memberid] => 12345 [address1] => 1234 Mockingbird Lane [address2] => [city] => Oakland [state] => CA [zip] => 91111 [country] => United States [phone] => Array [0] => Array [memberid] => 12345 [phonenumber] => 415.555.1212 [countrycodeid] => 1 [phonetype] => Mobile [custcode] => Array [0] => Array [memberid] => 12345 [ccode] => Silver [deleted] => 1 [1] => Array [memberid] => 12345 [ccode] => Gold 

Вы можете использовать DOMDocument и его поля / методы для извлечения данных.

DOMDocument также DOMNode имеет поле, называемое атрибутами, которое представляет собой карту имени атрибута и узла значения, чтобы вы могли получить от него имя атрибута и значение (# 6-9). У каждого узла alos есть firstChild и следующий брат, с которым вы можете перемещаться по всем узлам (# 12-26).

Из этого вы можете создать массив данных соответственно. Вот код, который я использовал (с небольшими корректировками).

 /*01*/ function Parse($XMLNode, $XMLData = null) { /*02*/ if ($XMLData == null) /*03*/ $XMLData = array(); /*04*/ /*05*/ // Extract attribute as the array values /*06*/ if ($XMLNode->hasAttributes()) { /*07*/ foreach ($XMLNode->attributes as $AttrName => $AttrNode) /*08*/ $XMLData[$AttrName] = $AttrNode->nodeValue; /*09*/ } /*10*/ /*11*/ // Loop all child /*12*/ $Child = $XMLNode->firstChild; /*13*/ while ($Child != null) { /*14*/ $Name = $Child->nodeName; /*15*/ if ($Name != "#text") { // Ignore the text /*16*/ $Nodes = $XMLData[$Name]; /*17*/ if ($Nodes == null) /*18*/ $Nodes = array(); // Array value from subnode is a nest array /*19*/ /*21*/ $Nodes[] = Parse($Child); /*22*/ $XMLData[$Name] = $Nodes; /*23*/ } /*24*/ /*25*/ $Child = $Child->nextSibling; /*26*/ } /*27*/ return $XMLData; /*28*/ } /*29*/ /*31*/ $XML = <<<EOF /*32*/ <cust rid="999999" memberid="12345" lname="Doe" fname="John"> /*33*/ <address memberid="12345" address1="1234 Mockingbird Lane" address2="" city="Oakland" state="CA" zip="91111" country="United States" /> /*34*/ <phone memberid="12345" phonenumber="415.555.1212" countrycodeid="1" phonetype="Mobile" /> /*35*/ <custcode memberid="12345" ccode="Silver" deleted="1" /> /*36*/ <custcode memberid="12345" ccode="Gold" /> /*37*/ </cust> /*38*/ EOF; /*39*/ /*41*/ $DOC = new DOMDocument(); /*42*/ $DOC->loadXML($XML); /*43*/ $Data = Parse($DOC->firstChild); /*44*/ /*45*/ print_r($Data); 

Вышеприведенный код возвращает результат, как вы ожидали.

Надеюсь это поможет.

Вы должны попробовать использовать DOM . В комментариях есть несколько функций dom2array, и если они не сработают для вас, они могут дать вам дополнительные идеи.

Если вы используете PHP 5, используйте SimpleXML . Он намного чище, проще в использовании и быстрее, чем DOM. Если вы используете PHP 4, вам нужно использовать DomXML, а не Dom .

Ответ NawaMan – это, вероятно, то, что вам нужно, но если вы хотите упростить свой код PHP DOM, вы также можете рассмотреть phpQuery, вдохновленный jQuery .