簡體   English   中英

使用PHP從XML文檔中刪除特定類型的所有元素

[英]Delete all elements of a certain type from an XML doc using PHP

我的任務應該很簡單:從XML文檔中刪除<places>節點及其后代,剩下其他節點。

我嘗試了這段代碼,但是沒有用...

$document->preserveWhiteSpace = false; 
$books = $xpath->query('piletilve_info/places');
//echo "4";

foreach ($books as $places) {
    while($places->hasChildNodes()) {
        $places->removeChild($places->childNodes->item(0));
    }

    $places->parentNode->removeChild($places);
}

要處理的源XML:

<piletilve_info>
   <places>
      <place>
        ...
      </place>
   </places>
   <other node>
      ...
   </other node>
</piletilve_info>

在實際數據中,有更多的節點沒有放置,但為簡單起見,此示例僅顯示了一些。

我看到了C#示例,但是我無法將代碼移植到PHP。

澄清 :在代碼段中,變量$books只是查詢列表的持有人。 這個名字沒有意義。

目標是刪除整個節點而保留其他節點(實際上還有更多,但為簡單起見,此示例顯示了所有

$dom = new DOMDocument;
$dom->load('places.xml');
foreach ($dom->getElementsByTagName('places') as $places)
{
    $places->parentNode->removeChild($places);
}
echo $dom->saveXml();

將刪除文檔中任何位置的所有<places>元素,包括所有子元素。

輸出:

<?xml version="1.0"?>
<piletilve_info>

   <other>
      ...
   </other>
</piletilve_info>

當我使用接受的答案時,它不會刪除所有出現的標簽。 foreach循環可能會跳過標簽,可能是因為foreach依賴於內部數組指針,並且在循環內對其進行更改會導致意外行為。

我發現一個可行的解決方案如下所示。

$dom = new DOMDocument;
$dom->load('places.xml');
$placesNodes = $dom->getElementsByTagName('places') 
while ($placesNodes->length > 0) {
    $node = $placesNodes->item(0);
    $node->parentNode->removeChild($node);
}
echo $dom->saveXml();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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