2016-07-20 16 views
0

私はPHPで解析しようとしているXMLファイル(下記)を持っています。XML DOMリストから属性値を取得

<content> 
    <row label='DEV'> 
    <cell href="exUrl('URL')" status='0'>12345</cell> 
    <cell href="exUrl('URL')" status='1'>12345</cell> 
    <cell href="exUrl('URL')" status='1'>12345</cell> 
    <cell href="exUrl('URL')" status='1'>12345</cell> 
    <cell href="exUrl('URL')" status='1'>12345</cell> 
    </row> 
    <row label='DEV2'> 
    <cell href="exUrl('URL')" status='1'>56789</cell> 
    <cell href="exUrl('URL')" status='1'>56789</cell> 
    <cell href="exUrl('URL')" status='1'>56789</cell> 
    <cell href="exUrl('URL')" status='1'>56789</cell> 
    <cell href="exUrl('URL')" status='0'>56789</cell> 
    </row> 
</content> 

私は現在、PHPを使用して、XML文書(以下の例)からいくつかの「行」を合計しています。

$dom = new DOMDocument(); 
$html = $dom->loadHTMLFile("XML.xml"); 
$dom->preserveWhiteSpace = false; 
$tables = $dom->getElementsByTagName('content'); 
$rows = $tables->item(0)->getElementsByTagName('row'); 
foreach ($rows as $row) 
{ 
    $cols = $row->getElementsByTagName('cell'); 
    $totalValues += $cols->item(4)->nodeValue; 
} 

ステータス値を確認するif文を含めるようにforループを更新しましたが、これは動作していないようです。

foreach ($rows as $row) 
{ 
    $cols = $row->getElementsByTagName('cell'); 
    $totalValues += $cols->item(4)->nodeValue; 
    if(($cols->item(4)->getElementsByTagName('status')->nodeValue) == 0) { 
     $flag = 0; 
    } 
} 

ここで間違っていることを助けてくれる人はいますか?

+0

'$ cols-> item(4) - > getAttribute( 'status')== 0' – splash58

答えて

1

statusは要素ノードではなく属性ノードです。値を取得する方法はいくつかあります。

if ($cols->item(4)->getAttribute('status') == 0) { ... 

または、属性ノードをフェッチしてその値を読み取ることが最も簡単です。

if ($cols->item(4)->getAttributeNode('status')->value == 0) { ... 

最後に、あなたはXPathを使用しループ最適化し、$flagを設定するには、XPath式を使用することができます。

$document = new DOMDocument(); 
$document->load($xmlFile); 
$xpath = new DOMXpath($document); 

$total = 0; 
foreach ($xpath->evaluate('/content/row/cell[5]') as $cell) { 
    $total += $cell->nodeValue; 
} 

$flag = $xpath->evaluate('count(/content/row/cell[5][@status=0]) > 0'); 

var_dump($total, $flag); 

第Xpath式/content/row/cell[5]/content/row内の5番目の位置を有する全てcell要素ノードを取り出します。

リストは、status属性の値でフィルタリングされます。ノードstatusがあるcellのノードがカウントされます。その数が0より大きい場合、式はtrueを返します。

関連する問題