2012-12-11 19 views
1

好了,所以可以說,我有一個XML看起來像這個例子中,如何獲取所有XML元素ID並計入一個數字?

<?xml version="1.0" encoding="UTF-8"?> 

    <stats id="865" name="blaah"> 
     <example name="blaahblaah"> 
      <example1> 
       <x ppoints="500"/> 
      </example1> 
      <example2> 
       <x ppoints ="150"/> 
       <x points ="500"/> 
       <x ppoints ="140"/> 
       <x points="200"/> 
      </example2> 
     </example> 
    </stats> 

什麼,我想在這裏做的是讓所有的ppoints,圓他們到一個號碼,所有的點,圓他們進入一個號碼, 像這樣

統計: 「圍捕ppoints」 PP & 「向上取整點」 p

幫助的人?非常感謝

+2

而且你有什麼這麼遠嗎?你還沒有加載文件? –

回答

2

在這種情況下,我的理解文檔的結構可以包含多個「示例」節點,我認爲最好的辦法是加載XML文檔,並使用XPath表達式來獲取所有節點與ppoints屬性和points屬性。

使用XPath有兩種可能的解決方案。一個使用SimpleXMLElement::xpath檢索所有需要的節點並手動求和。另一個使用DOMXPath::evaluate,它允許評估任何類型的XPath表達式並僅使用XPath對這些值進行求和。後者的解決方案更簡單。

DOMXPath ::評估

<?php 

$doc = new DOMDocument; 
$doc->load('file.xml'); 
$xpath = new DOMXPath($doc); 

$sum_ppoints = $xpath->evaluate('sum(//x/@ppoints)'); 
$sum_points = $xpath->evaluate('sum(//x/@points)'); 

print "Ppoints: $sum_ppoints; Points: $sum_points\n"; 

?> 

的SimpleXMLElement :: XPath的

<?php 

// Load XML file 
$file = "file.xml"; 
$content = file_get_contents($file); 
$xml = new SimpleXMLElement($content); 

// Compute sum ppoints 
$sum_ppoints = 0; 
$nodes = $xml->xpath('//x[@ppoints]'); 
foreach ($nodes as $node) { 
    $sum_ppoints += $node->attributes()->ppoints; 
} 

// Compute sum points 
$sum_points = 0; 
$nodes = $xml->xpath('//x[@points]'); 
foreach ($nodes as $node) { 
    $sum_points += $node->attributes()->points; 
} 

print "Ppoints: $sum_ppoints; Points: $sum_points\n"; 

?> 
+1

我不是一個PHP專家,但如果你可以使用XPath,爲什麼不只是'sum(// x/@ points)'和'sum(// x/@ ppoints)'? – Pawel

+0

@Pawel感謝您的指點。我不知道總和。根據PHP文檔SimpleXMLElement :: xpath「爲匹配XPath路徑的子節點搜索SimpleXML節點」,因此顯然僅用於搜索節點。我嘗試了這個表達,並且失敗了。但是,還有另一個PHP函數DOMXPath :: evaluate:「執行給定的XPath表達式並在可能的情況下返回類型化結果」。有了這個功能,它的作品。更新了答案。 –