2011-12-08 18 views
0

嗨,想知道是否有人可以帮助我。将XML Feed的某些值一起添加,然后输出

第一下面的代码基本上计算每个XML记录和输出在所需FORMATT

旧代码

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://xxxxx'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$xml_string = curl_exec ($ch); 
curl_close ($ch); 

// parse data 
$xml=simplexml_load_string($xml_string); 

// fix to n slots, zero padded 
$slots=6; 
$counter = substr((string)(pow(10,$slots)+count($xml)),1,$slots); 

for($c=0; $c<strlen($counter); $c++) 
{ 
    echo("<span>".$counter[$c]."</span>"); 
} 

出把

<span>1</span><span>3</span><span>5</span><span>6</span><span>8</span><span>8</span> 

,这是一切OK,但现在XML饲料已经改变,正在输出下面。

<Data> 
    <Row> 
     <Column name="cam" type="xs:int">000</Column> 
     <Column name="camN" type="xs:string">hello</Column> 
     <Column name="numer" type="xs:int">1</Column> 
    </Row> 
    <Row> 
     <Column name="cam" type="xs:int">000</Column> 
     <Column name="camN" type="xs:string">hello</Column> 
     <Column name="numer" type="xs:int">985</Column> 
    </Row> 
    <Row> 
     <Column name="cam" type="xs:int">000</Column> 
     <Column name="camN" type="xs:string">hello</Column> 
     <Column name="numer" type="xs:int">1</Column> 
    </Row>  
</Data> 

我需要相同的输出发生,但不知道我怎么把数值从每个记录+它们togther,然后输出他们确保我有6个charactures即使它结束了000005作为一种价值

干杯

更新


抱歉,我需要将NUMER值加在一起,以得到六君煎所以如果六君煎为987我需要它输出:

<span>0</span><span>0</span><span>0</span><span>9</span><span>8</span><span>7</span>

+0

我不明白所需的输出。应该总结新XML上的哪些值? – nickb

+0

对不起,我的帖子对不起,错过了关闭 – odd

回答

1

您可以使用XPath来抓住你想要的节点,就像这样:

$xml = simplexml_load_string($xml); 
$elements = $xml->xpath("/Data/Row/Column[@name='numer']"); 
$sum = 0; 
foreach($elements as $el) 
{ 
    $sum += $el[0]; 
} 
echo $sum; // Prints 12660 

现在,让你的期望的输出,垫零数,将它分成1个字符的块,并将其输出,如所以:

$formatted = sprintf('%06d', $sum); 
echo '<span>' . implode('</span><span>', str_split($formatted)) . '</span>'; 
+0

谢谢,即使价值是400,我总是会确保它的6个charactures,我需要它输出000400,并跨越像上面这样的价值。 – odd

+0

对sprintf的调用将处理':)' - 这就是为什么它具有'%06d',这意味着将数字格式化为宽度为6的十进制值,并且如果数字不是6位数。 – nickb

+0

非常完美的谢谢你对我的帮助,今天我学到了一些新东西....现在它可以导出6位数字,但由于某些原因,它们都是0,它们应该是一个值,因为我知道xml有值得加起来,让我看看这个 – odd

2

SimpleXml是做最简单的方法。鉴于你提供的XML:

$xml = ' 
<Data> 
    <Row> 
     <Column name="cam" type="xs:int">000</Column> 
     <Column name="camN" type="xs:string">hello</Column> 
     <Column name="numer" type="xs:int">5220</Column> 
    </Row> 
    <Row> 
     <Column name="cam" type="xs:int">000</Column> 
     <Column name="camN" type="xs:string">hello</Column> 
     <Column name="numer" type="xs:int">4220</Column> 
    </Row> 
    <Row> 
     <Column name="cam" type="xs:int">000</Column> 
     <Column name="camN" type="xs:string">hello</Column> 
     <Column name="numer" type="xs:int">3220</Column> 
    </Row>  
</Data> 
'; 

$xml = simplexml_load_string($xml); 
$numer_sum = 0; 

// sums the value of columns 
foreach ($xml->Row as $row) { 
    $numer_sum += (int)$row->Column[2]; 
} 

或者,你可以使用XPath以确保你总是使用总结NAME =“NUMER”列元素即使的XML列的顺序:

$xml = simplexml_load_string($xml); 

// get only the column elements with name="numer" 
$xpath_result = $xml->xpath('Row/Column[@name="numer"]'); 
$sum = 0; 

foreach ($xpath_result as $numer) { 
    $sum += (int)$numer[0]; 
} 

echo $sum; 
+0

感谢您的回复我已经问过一个问题重新格式化 – odd

+0

嗯,你的问题明确表示你已经控制了代码的一部分。 XML中的更改不会影响串联字符串的能力。我无法为你编写代码,这不是你想要的。 – rdlowrey

+0

非常感谢你在这方面的帮助 – odd

相关问题