我是 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>
从上面的输出中我可以看到只返回了一本书。我们如何获得所有书籍?
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");
}
}