如何使用 boost c++ 删除具有多个实例的节点的所有 xml 子节点

问题描述 投票:0回答:1

我是 boost xml 解析器的新手,需要一些帮助。我想删除下面示例中每本书的价格节点。 我能够删除所有书籍的作者。但只能删除一本书的价格。如何删除现有书籍的价格?

#include <iostream>
#include <boost/foreach.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/property_tree/detail/ptree_utils.hpp>


int main() {
    std::istringstream iss(R"(
<BookData>
   <Book><Author>A1</Author><Name>B1</Name><Config><Price>C1</Price><Model>M1</Model></Config></Book>
   <Book><Author>A2</Author><Name>B2</Name><Config><Price>C2</Price><Model>M2</Model></Config></Book>
   <Book><Author>A(n-1)</Author><Name>B(n-1)</Name><Config><Price>C(n-1)</Price><Model>M3</Model></Config></Book>
   <Book><Author>A(n)</Author><Name>B(n)</Name><Config><Price>C(n)</Price><Model>M4</Model></Config></Book> 
</BookData>
)");

    boost::property_tree::ptree pt;
    read_xml(iss, pt);

    
    for (auto& node : pt.get_child("BookData")) {
        std::cout << "Child node of BookData: " << node.first << std::endl;
        node.second.erase("Author");
        
    }
    
     for (auto& node : pt.get_child("BookData.Book")) {
        std::cout << "Child node of Book: " << node.first << std::endl;
        if(node.first == "Config" ) {
            std::cout << "Erasing Price" << std::endl;
            node.second.erase("Price");
        }  
    }
    
    write_xml(std::cout, pt, boost::property_tree::xml_writer_make_settings<std::string>(' ', 4));
}

输出:

Child node of BookData: Book
Child node of BookData: Book
Child node of BookData: Book
Child node of BookData: Book
Child node of Book: Name
Child node of Book: Config
Erasing Price
<?xml version="1.0" encoding="utf-8"?>
<BookData>
    
   
   
   
    

    <Book>
        <Name>B1</Name>
        <Config>
            <Model>M1</Model>
        </Config>
    </Book>
    <Book>
        <Name>B2</Name>
        <Config>
            <Price>C2</Price>
            <Model>M2</Model>
        </Config>
    </Book>
    <Book>
        <Name>B(n-1)</Name>
        <Config>
            <Price>C(n-1)</Price>
            <Model>M3</Model>
        </Config>
    </Book>
    <Book>
        <Name>B(n)</Name>
        <Config>
            <Price>C(n)</Price>
            <Model>M4</Model>
        </Config>
    </Book>
</BookData>

从上面的输出中我可以看到只返回了一本书。我们如何获得所有书籍?

c++ xml boost
1个回答
0
投票

pt.get_child("BookData.Book")
不会迭代所有
Book
节点。它将获取第一个
Book
节点,然后获取其子节点并迭代它们。

相反,您应该迭代

BookData
的所有子节点(即
Book
节点)并从
Price
中删除
Book.Config
节点:

for (auto& node : pt.get_child("BookData"))
{
    if (node.first == "Book")
    {
        std::cout << "Erasing Price \n";
        node.second.get_child("Config").erase("Price");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.