[英]php DOMDocument xml filtering elements
我已經失去了半天了。 雖然不是專家。 為什么用php遍歷和操作xml比在紙上處理數據更難(看來)? 為什么沒有像jQuery這樣的簡單系統呢?
我一直在嘗試基於一個簡單的條件從長列表(580個元素)中刪除一些元素: if (element['attr'] == value) {remove element}
但我只是沒有到達那里。
這是我的代碼:
$xml = simplexml_load_file('xml/suchia.xml');
$dom = new DOMDocument('1.0');
$dom->loadXML($xml->asXML());
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
foreach ($dom->getElementsByTagName('image') as $node) {
echo 'Checking '.$node->getAttribute('id').'<br />';
if ($node->getAttribute('value') == 'useless') {
echo $node->getAttribute('id').' deleted.<br />';
$node->parentNode->removeChild($node);
}
}
$dom->save('xml/suchia.xml');
通過第一個回聲,我可以看到的主要問題是foreach並沒有遍歷它看起來的每個元素。 對於更長的列表,似乎甚至不可能進行簡單的循環(我的xml文件大約為180,000個字符)。
XML(縮短了,也許不可能用一個小的xml文件來重構我的問題):
<?xml version="1.0"?>
<suchia>
<image id="1" value="useless">
<sources>
<src>a</src>
</sources>
</image>
<image id="2" value="useless">
<sources>
<src>b</src>
</sources>
</image>
<image id="3" value="useless">
<sources>
<src>c</src>
</sources>
</image>
<image id="4" value="useless">
<sources>
<src>d</src>
</sources>
</image>
<image id="5" value="useless">
<sources>
<src>e</src>
</sources>
</image>
<image id="6" value="useless">
<sources>
<src>f</src>
</sources>
</image>
<image id="7" value="useless">
<sources>
<src>g</src>
</sources>
</image>
<image id="8" value="useful">
<sources>
<src>h</src>
</sources>
</image>
</suchia>
因為要在通過實時DOMNodeList進行迭代時從父節點中刪除節點,所以迭代器只會看到其他所有節點。 正如Ghost建議的那樣,使用XPath允許在刪除節點時進行迭代。
如果在適當的位置設置了preserveWhiteSpace
(需要在解析XML之前將其設置,而formatOutput
僅應用於輸出),那么多余的空格將不會出現在輸出中。
<?php
$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$doc->load('input.xml');
$xpath = new DOMXPath($doc);
$nodes = $xpath->query('image[@value="useless"]');
printf("Removing %d useless images\n", $nodes->length);
foreach ($nodes as $node) {
$node->parentNode->removeChild($node);
}
$doc->formatOutput = true;
$doc->save('output.xml');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.