2015-01-21 73 views
1

我對XML文件中像腓循環throught XML節點

<response> 
<tag1> 
    <item> 
     <id>106</id> 
     <title>DG</title> 
    </item> 
    <item> 
     <id>105</id> 
     <title>AC</title> 
    </item> 
</tag1> 
<tag2> 
    <item> 
     <id>1</id> 
     <title>DjG</title> 
    </item> 
    <item> 
     <id>15</id> 
     <title>AoC</title> 
    </item> 
</tag2> 
</response> 

我想這個代碼以提取ID和標題

$dom = new DomDocument(); 
    $dom->load('xml.xml'); 
    $xpath = new DOMXPath($dom); 

    foreach($xpath->evaluate('//response/*') as $node){ 
    $params =$xpath->evaluate('//response/' .$node->nodeName . '/item/*'); 
     foreach($params as $child) { 
      echo $node->nodeName ." = " .$child->nodeName ." = " .$child->nodeValue ."\n<br>"; 
     } 
    } 

,但我得到的結果,例如

<br>tag1 = id = 106 
<br>tag1 = title = DG 
<br>tag1 = id = 105 
<br>tag1 = title = AC 
<br>tag2 = id = 1 
<br>tag2 = title = DjG 
<br>tag2 = id = 15 
<br>tag2 = title = AoC 

但我需要像這樣得到


TAG1 = 106 = DG
TAG1 = 105 = AC
TAG2 = 1 = DJG
TAG2 = 15 = AoC的

回答

2

在第二foreach ,只是目標$node->nodeName,然後在內部的foreach目標每個id一個標題。

foreach($xpath->evaluate('//response/*') as $node) { 
    $tag = $node->nodeName; 
    $params = $xpath->evaluate("//$tag/*"); 
    foreach($params as $child) { 
     $id = $xpath->evaluate('string(./id)', $child); 
     $title = $xpath->evaluate('string(./title)', $child); 
     echo $tag ." = " .$id ." = " .$title ."\n<br>"; 
    } 
} 

Sample Output

還是SimpleXML版本:

$xml = simplexml_load_file('xml.xml'); 
foreach($xml as $tag =>$node) { 
    foreach($node as $item => $child) { 
     echo $tag ." = " .$child->id ." = " .$child->title ."\n<br>"; 
    } 
} 

Sample Output

+0

@DmitrijHolkin剛剛拿到個人的孩子,請查看我的修訂 – Ghost 2015-01-21 11:15:08

+0

感謝之多。效果不錯 – 2015-01-21 11:20:32

+0

@DmitrijHolkin很高興這有幫助 – Ghost 2015-01-21 11:25:25

1

使用此代碼:

$dom = new DomDocument(); 
$dom->load('xml.xml'); 
$xpath = new DOMXPath($dom); 
foreach($xpath->evaluate('//response/*') as $node){ 
    $params =$xpath->evaluate('//response/' .$node->nodeName . '/*'); 

    foreach($params as $child) 
    { 
     echo $node->nodeName ." = " .$child->getElementsByTagName('id')->item(0)->textContent ." = " .$child->getElementsByTagName('title')->item(0)->textContent ."\n<br>"; 
    } 
} 
+1

公告:未定義的屬性:的DOMNodeList :: $項目 – 2015-01-21 11:10:40

1

DOMXpath的第二個參數::評估()是上下文節點。如果你不用斜槓啓動XPath表達式,它將與它相關。因此,在一個循環中,您通常希望將當前節點用作表達式的上下文。

foreach ($xpath->evaluate('/absolute-expression') as $node) { 
    var_dump(
    $xpath->evaluate('relative-expression', $node) 
); 
} 

XPath(與CSS選擇器不同)可以獲取沿不同軸的元素屬性。你可以得到當地名(不帶命名空間前綴)父節點:

local-name(parent::*)

利用這一點,你可以用一個循環遍歷item元素解決問題。

實施例:

$dom = new DomDocument(); 
$dom->loadXml($xml); 
$xpath = new DOMXPath($dom); 

foreach ($xpath->evaluate('//response/*/item') as $node) { 
    echo 
    $xpath->evaluate('local-name(parent::*)', $node), ' = ', 
    $xpath->evaluate('string(id)', $node), ' = ', 
    $xpath->evaluate('string(title)', $node), "\n"; 
} 

輸出:

tag1 = 106 = DG 
tag1 = 105 = AC 
tag2 = 1 = DjG 
tag2 = 15 = AoC 

只是,如果需要調用源的每個第一級節點(TAG1,TAG2)。你將需要兩個循環。像輸出由標籤*元素節點分組的項目一樣。

$dom = new DomDocument(); 
$dom->loadXml($xml); 
$xpath = new DOMXPath($dom); 

foreach ($xpath->evaluate('//response/*') as $node) { 
    echo 
    $xpath->evaluate('local-name()', $node), 
    "\n--------\n"; 
    foreach ($xpath->evaluate('item', $node) as $item) { 
    echo 
     $xpath->evaluate('string(id)', $item), ' = ', 
     $xpath->evaluate('string(title)', $item), "\n"; 
    } 
    echo "\n"; 
} 

輸出:

tag1 
-------- 
106 = DG 
105 = AC 

tag2 
-------- 
1 = DjG 
15 = AoC 
+0

只有麻煩如何使用把每個本地名分開php文件作爲數組'$ data ='\ n'「。$ xpath-> evaluate('string(id)',$ node)。」'=>'「。$ xpath-> evaluate('string(title)',$ node) ,';'_'file_put_contents(「。」。$ path。$ xpath-> evaluate('local-name(parent :: *)',$ node)。'。php','<?php $ arr = array ('。$ data。'\ n); \ n?>');'不能很好地工作 – 2015-01-21 13:11:10

+0

這不是您的原始問題中的請求,我在我的答案中添加了一個示例。 – ThW 2015-01-21 13:21:27