2009-10-17 56 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