【问题标题】:How to delete the last xml node and its child with boost lib?如何使用 boost lib 删除最后一个 xml 节点及其子节点?
【发布时间】:2017-06-12 07:25:30
【问题描述】:

我想从 XML 文件中删除一个节点。

XML 字符串如下所示:

<BookData>
   <Book><Author>A1<Author><Name>B1</Name><Price>C1</Price></Book>
   <Book><Author>A2<Author><Name>B2</Name><Price>C2</Price></Book>
     ...
   <Book><Author>A(n-1)<Author><Name>B(n-1)</Name><Price>C(n-1)</Price></Book>
   <Book><Author>A(n)<Author><Name>B(n)</Name><Price>C(n)</Price></Book> 
</BookData>

我希望它以这样的方式结束。

 <BookData>
       <Book><Author>A1<Author><Name>B1</Name><Price>C1</Price></Book>
       <Book><Author>A2<Author><Name>B2</Name><Price>C2</Price></Book>
         ...
       <Book><Author>A(n-1)<Author><Name>B(n-1)</Name><Price>C(n-1)</Price></Book> 
    </BookData>

如何使用 boost lib 做到这一点?

【问题讨论】:

    标签: xml boost boost-propertytree


    【解决方案1】:

    你可以使用反向迭代器rbegin(),但是转换到它的基迭代器总是有点棘手:

        auto& root = pt.get_child("BookData");
        root.erase(std::next(root.rbegin()).base());
    

    cppreference有一个整洁的插图:

    Live On Coliru

    #include <iostream>
    #include <boost/property_tree/xml_parser.hpp>
    
    int main() {
        std::istringstream iss(R"(
    <BookData>
       <Book><Author>A1</Author><Name>B1</Name><Price>C1</Price></Book>
       <Book><Author>A2</Author><Name>B2</Name><Price>C2</Price></Book>
       <Book><Author>A(n-1)</Author><Name>B(n-1)</Name><Price>C(n-1)</Price></Book>
       <Book><Author>A(n)</Author><Name>B(n)</Name><Price>C(n)</Price></Book> 
    </BookData>
    )");
    
        boost::property_tree::ptree pt;
        read_xml(iss, pt);
    
        auto& root = pt.get_child("BookData");
        root.erase(std::next(root.rbegin()).base());
    
        write_xml(std::cout, pt, boost::property_tree::xml_writer_make_settings<std::string>(' ', 4));
    }
    

    打印

    <?xml version="1.0" encoding="utf-8"?>
    <BookData>
    
        <Book>
            <Author>A1</Author>
            <Name>B1</Name>
            <Price>C1</Price>
        </Book>
        <Book>
            <Author>A2</Author>
            <Name>B2</Name>
            <Price>C2</Price>
        </Book>
        <Book>
            <Author>A(n-1)</Author>
            <Name>B(n-1)</Name>
            <Price>C(n-1)</Price>
        </Book>
    </BookData>
    

    【讨论】:

    • 非常感谢。但我有一个小问题。如果&lt;BookData&gt;是随机名称,如何获取&lt;Book&gt;节点的父节点?
    • @ThếHảiNguyễn 呵呵。您只需编写代码即可。或者,您可以使用 XML 库,而不是 PropertyTree 库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2018-04-07
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多