PHP - Bu nasıl xml ayrıştırmak için?

4 Cevap php

Ben örnek dahil benzeyen bir dizi ile rüzgar bu nedenle aşağıda XML ayrıştırmak çalışıyorum ... Ben çıktı istediğim şekilde etiketlerin içine özelliklerini almak için nasıl bulmaktan zor bir zaman yaşıyorum o kadar ...

The 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>

The Array I want :: Note the added array elements

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

4 Cevap

Sen veri ayıklamak için DOMDocument ve alanları / yöntemlerini kullanabilirsiniz.

DOMDocument is also DOMNode has a field called attributes which is a map of attribute name and the node of value so you can get the attribute name and value from it (#6-9). Each node alos have firstChild and next sibling which you can navigate through all sub nodes (#12-26).

Buna göre veri dizisi oluşturabilirsiniz bundan. Burada (biraz ayarlamaları) kullanılan koddur.

/*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);

Yukarıdaki kod beklendiği gibi sonuç verir.

Umarım bu yardımcı olur.

Sen DOM kullanarak denemelisiniz. Orada birkaç dom2array işlevleri yorumlar vardır ve onlar sizin için işe yaramazsa, onlar size daha fazla fikir verebilir.

Eğer PHP 5 kullanıyorsanız kullanın SimpleXML. Bu çok daha temiz, kullanımı kolay ve DOM daha hızlıdır. Eğer PHP 4 kullanıyorsanız, Dom DomXML değil, kullanmak zorunda.

NawaMan cevabı muhtemelen neye ihtiyacınız olduğunu, ama genellikle PHP DOM kodunu basitleştirmek istiyorsanız, siz de jQuery ilham phpQuery düşünebilirsiniz.