2009-10-17 5 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에는 속성 이름과 값 노드를 매핑하는 attribute라는 필드가 있습니다 (# 6-9). 따라서 속성 이름과 값의 노드를 얻을 수 있습니다. 각 노드에는 모든 하위 노드 (# 12-26)를 탐색 할 수있는 firstChild 및 다음 형제가 있습니다.

데이터 배열을 적절하게 만들 수 있습니다. 다음은 내가 사용한 코드입니다 (비트 조정 포함).

/*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을 고려해 볼 수 있습니다.

관련 문제