2014-06-16 24 views
0

我有一些boost::property_tree::ptree。我需要使用特定標籤名稱刪除某些元素的樹。例如,XML源ptree如下:如何從Boost.PropertyTree複製子樹

<?xml version="1.0" encoding="utf-8"?> 
<document> 
    <B atr="one" atr1="something"> 
    <to_remove attr="two">10</to_remove> 
    </B> 
    <to_remove> 
    <C>value</C> 
    <D>other value</D> 
    </to_remove> 
    <E>nothing</E> 
</document> 

而且我想獲得ptree通過類似以下的XML:

<?xml version="1.0" encoding="utf-8"?> 
<document> 
    <B atr="one" atr1="something" /> 
    <E>nothing</E> 
</document> 

如何編寫功能,即去掉產生新ptree<to_remove>節點?

回答

1

ptree的value_type是std :: pair < const Key,self_type>,因此您可以迭代樹並移除相應的節點。以下是一個示例。

void remove(ptree &pt){ 
using namespace boost::property_tree; 
    for (auto p = pt.begin(); p != pt.end();){ 
     if (p->first == "to_remove"){ 
      p = pt.erase(p); 
     } 
     else{ 
      remove(p->second); 
      ++p; 
     } 
    } 
} 
0

UPDATE我的回答換成由於意見:我建議,而是使用正確的XML庫。

我相信Boost PropertyTree在內部使用一個修改過的RapidXml(但它是一個實現細節,所以我不確定我會依賴它)。這是我對其採取使用PugiXML,這是一個現代化的,頭只,非驗證XML庫:

#include <pugixml.hpp> 
#include <iostream> 

int main() 
{ 
    pugi::xml_document doc; 
    doc.load_file("input.txt"); 

    for (auto& to_remove : doc.select_nodes("descendant-or-self::to_remove/..")) 
     while (to_remove.node().remove_child("to_remove")); 

    doc.save(std::cout); 
} 

打印

<?xml version="1.0"?> 
<document> 
    <B atr="one" atr1="something" /> 
    <E>nothing</E> 
</document> 
+0

謝謝。然而,這個解決方案不適合,因爲它很難確定特定的XML結構。 – Loom

+0

@噢,好吧,我沒有耐心告訴你如何滾動屬性樹,我想你也可以閱讀文檔。我已經更新了我的答案,告訴你我會做什麼 – sehe