2011-07-07 60 views
3

我有一個xml文件,具有不同的命名節點和多級子節點(這是不同的節點之間)。我應該如何訪問數據?它會需要很多嵌套for循環嗎?PHP簡單的XML如何讀取多個節點與不同的子節點級別

下面是XML代碼的樣本:

 <start_info> 
      <info tabindex="1"> 
        <infonumber>1</infonumber> 
        <trees>green</trees> 
      </info> 
     </start_info> 

      <people> 
       <pe> 
        <people_ages> 
         <range number="1"> 
          <age value="1">1</age> 
          <age value="2">2</age> 
         </range> 
        </people_ages> 
       </pe> 
      </people> 

這裏是我到目前爲止的代碼:

$xml = simplexml_load_file("file.xml"); 

echo $xml->getName() . "start_info"; 

foreach($xml->children() as $child) 
    { 
    echo $child->getName() . ": " . $child . "<br />"; 
    } 
+0

你到底想達到什麼目的?提取所有人? –

+0

是,並將其顯示在屏幕上 – tdjfdjdj

回答

2

下面是一些示例代碼,我希望可以爲您指出正確的方向。本質上,它是行走DOMDocument呼應的元素名稱和值。請注意,元素之間的空白是重要的,因此爲了演示的目的,XML被壓縮。你可能會從文件中找到類似的問題,所以如果你沒有得到預期的輸出,你可能需要去掉空白節點。

如果您只想要<people>元素,您可以用不同的XPath代替//root/*,例如//people

<?php 
    $xml = <<<XML 
    <root><start_info><info tabindex="1"><infonumber>1</infonumber><trees>green</trees></info></start_info> 
    <people><pe><people_ages><range number="1"><age value="1">1</age><age value="2">2</age></range></people_ages></pe></people> 
    </root> 
    XML; 

    $dom = new DOMDocument(); 
    $dom->recover = true; 
    $dom->loadXML($xml); 
    $xpath = new DOMXPath($dom); 
    $nodelist = $xpath->query('//root/*'); 
    foreach ($nodelist as $node) { 
     echo "\n$node->tagName"; 
     getData($node); 
    } 

    function getData($node) { 
     foreach ($node->childNodes as $child) { 

      if ($child->nodeType == XML_ELEMENT_NODE) { 
       echo ($child->tagName === '' ? '' : "\n").$child->tagName; 
      } 

      if ($child->nodeType == XML_TEXT_NODE) { 
       echo '->'.$child->nodeValue; 
      } 

      if ($child->hasChildNodes()) { 
       getData($child); // recursive call 
      } 
     } 
    } 
?> 
0

檢查這個

$xml_file = 'file.xml'; 
$xmlobj = simplexml_load_file($xml_file); 
echo $xmlobj->getName() . 'start_info<br />'; 
foreach($xmlobj->children() as $childs) { 
    echo $childs->getName(). ': '. '<br />'; 
    if($childs->count()>1) { 
    foreach($childs as $child) { 
    echo $child->getName(). ': '. $child. '<br />'; 
    } 
    } 
}