2009-10-17 87 views
0

我想解析下面的XML,這樣我就可以看到包含樣本的數組了......我很難搞清楚如何獲取標籤內的屬性以輸出方式我希望它...PHP - 如何解析這個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 

回答

3

您可以使用DOMDocument及其字段/方法來提取數據。

DOMDocument也是DOMNode有一個名爲屬性的字段,它是屬性名稱和值的節點的映射,因此您可以從中獲取屬性名稱和值(#6-9)。 每個節點都有firstChild和next兄弟,您可以在所有子節點中導航(#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); 

上面的代碼按照預期返回結果。

希望這會有所幫助。

1

的陣列你應該嘗試使用DOM。評論中有幾個dom2array函數,如果它們不適合你,他們可以給你更多的想法。

1

如果您使用的是PHP 5,請使用SimpleXML。它比DOM更簡潔,更易於使用並且速度更快。如果您使用PHP 4,則必須使用DomXML而不是Dom

0

NawaMan的答案可能是你需要的,但如果你想簡化你的PHP DOM代碼,你也可以考慮jQuery風格的phpQuery