簡體   English   中英

PHP DOMDocument xml過濾元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM