2013-02-04 68 views
0

您好我正在使用DOM從xml文件中檢索數據。下面的代碼對於xml文件來說工作得非常好,但是我面臨的主要問題是它只識別根節點,它不識別子節點。 這裏是我的代碼: -在xml中獲取子節點的名稱

$dom = new DOMDocument(); 
    $dom->load($url); 
    $link = $dom->getElementsByTagName($tag_name); 
    $value = array(); 
for ($i = 0; $i < $link->length; $i++) { 
      $childnode['name']=$link->item($i)->nodeName; 
      $childnode['value']=$link->item($i)->nodeValue; 
      $value[ $childnode['name']] = $childnode['value']; 
     // echo $link->item($i)->nodeValue . '<br>'; 
     $k++; 
    } 

這是我在哪裏顯示數據

foreach($value as $node=>$value) 
{ 
echo "<b> Node :</b>".$node."<br /><b>Value:</b>".$value."<br /><hr>"; 
} 

我的視圖文件這是我的xml文件

<name>John</name> 
<place>Australia</place> 
<contact> 
<phone>8734563485</phone> 
<type>Mobile</type> 
</contact> 
<mail>somedata</mail> 

我能夠讀取父節點我,名字,地點,聯繫人,郵件。但我無法閱讀孩子節點我,電話,類型。 任何人都可以幫我的代碼....

+0

您使用什麼樣的值作爲'$ tag_name'?你從中得到了什麼樣的輸出? – JLRishe

+0

我正在使用一個父節點作爲輸入$ tag_name –

回答

1

因爲你不遍歷子節點當然。 我會創建一個函數並遍歷它遞歸。

function addNodesToValue($value,$nodelist) { 
    for ($i = 0; $i < $nodelist->length; $i++) { 
    $childnode['name']=$nodelist->item($i)->nodeName; 
    $childnode['value']=$nodelist->item($i)->nodeValue; 
    $value[ $childnode['name']] = $childnode['value']; 
    // recursive traverse child nodes 
    if($nodelist->item($i)->hasChildNodes()){ 
     $value = addNodesToValue($value,$nodelist->item($i)->childNodes); 
    } 
    } 
    return $value; 
} 

//usage 
$value = addNodesToValue($value,$link); 
+0

geting一個錯誤: - 嘗試獲取非對象的屬性...對於這行if($ nodelist-> item($ i) - > childNodes-> length> 0) –

+0

當然是。愚蠢的我。對不起,我沒有時間去測試它。我將它改爲 - > hasChildNodes() – superbly

+0

我得到一個空字符串.... –

0

這是怎麼回事?

function get_names($node) { 
    $names = array(); 
    foreach ($node->childNodes as $child) { 
     if ($child->nodeType == 1) { 
      $names[] = $child->nodeName; 
      if ($child->hasChildNodes()) { 
       $names[] = get_names($child); 
      } 
     } 
    } 
    return array_filter($names); 
} 

$xml = ' 
<root> 
    <name>John</name> 
    <place>Australia</place> 
    <contact> 
     <phone>8734563485</phone> 
     <type>Mobile</type> 
    </contact> 
    <mail>somedata</mail> 
</root>'; 
$names = get_names(DOMDocument::loadXML($xml)->firstChild); 
print_r($names); 

輸出;

 
Array 
(
    [0] => name 
    [2] => place 
    [4] => contact 
    [5] => Array 
     (
      [0] => phone 
      [2] => type 
     ) 

    [6] => mail 
) 
+0

我的要求是,如果我選擇一個節點,我想獲得所有其細節的子節點... –

+1

所以問一個正確的問題! –

0

解決:

注意,我的XML包含任意 '項目' 節點,所以值得您的XML測試。這裏是我的:

<news> 
<item> 
    <date>9/2/2014</date> 
    <title>Home Depot Breach</title> 
    <content>NEW YORK (AP) - My store may be the latest retailer</content> 
</item> 
<item> 
    <date>8/28/2014</date> 
    <title>Dairy Queen</title> 
    <content>Dairy Queen has the best ice cream</content> 
</item> 
</news> 

我有一個頁面列出了表中的項目。當您點擊其中一個項目時,它會將該項目的ID#發送到PHP腳本中...以下是我如何處理點擊的「項目」:

$xml = DOMDocument::load('news.xml'); 
$id = $_GET['i']; 

$date = $xml->getElementsByTagName('date')->item($id)->nodeValue; 
$title = $xml->getElementsByTagName('title')->item($id)->nodeValue; 
$content = $xml->getElementsByTagName('content')->item($id)->nodeValue;