我正在将一组结果写入XML文件。每个结果集都包含一系列结果。我的问题是(在几次执行代码期间)当我尝试将一些新结果写入一个集合时,XML解析器获取现有XML文件中的第一个(顶部)结果集,并将结果附加到(旧的)设定。 E.g:
<root>
<result_set result_number="0"> <--- Parser selects this result set
<result number="0">
<tolerance>100</tolerance>
</result>
<result number="1">
<tolerance>100</tolerance>
</result>
<resultnumber="0"> <---- This should be added to result set 1
<tolerance>100</tolerance>
</result>
</result_set>
<result_set result_number="1"/> <-- New result set added to Xml, missing results
</root>
因此,我想知道是否可以将最新的结果集写入XML文件的顶部?或者,在检索最新结果集时,获取列表中的最后一个结果?
我希望我已经清楚地解释了自己。 感谢
(我正在使用的示例代码)
void initialise(std::string filename)
{
ptree pt;
xml_writer_settings<char> w('\t', 1);
read_xml(filename, pt, boost::property_tree::xml_parser::trim_whitespace);
std::ofstream xmlFile(filename.c_str(), std::ios::out);
// Probably not the best way to check for a root node
try
{
ptree & rootNode = pt.get_child("root");
}
catch(...)
{
xmlFile << "<root></root>" << std::endl;
read_xml(filename, pt, boost::property_tree::xml_parser::trim_whitespace);
}
ptree & rootNode = pt.get_child("root");
ptree resultSetNode;
resultSetNode.add("<xmlattr>.result_number", 0);
rootNode.add_child("result_set", resultSetNode);
write_xml(filename, pt, std::locale(), w);
}
void save1(std::string filename)
{
ptree pt;
xml_writer_settings<char> w('\t', 1);
read_xml(filename, pt, boost::property_tree::xml_parser::trim_whitespace);
ptree &resultSetNode = pt.get_child("root.result_set");
ptree resultNode;
resultNode.put("tolerance", 100);
resultSetNode.add_child("result", resultNode);
write_xml(filename, pt, std::locale(), w);
}
int main()
{
initialise("sample.xml");
for(int i = 0; i < 2; ++i)
{
save1("sample.xml");
}
std::cout << "Success!!!\n";
return 0;
}
答案 0 :(得分:1)
这是我在boost邮件列表上的回复的复制/粘贴:
我认为你在这里误解了整个事情。
你有很多节点,其xpath是root/result_set
,但全部都是。{
它们具有标识它们的属性:result_number
。
当您致电get_child
时,您将获得一个任意节点(from boost
documentation):
self_type & get_child(const path_type & path) ;
让孩子到达指定路径,或者抛出
ptree_bad_path
。备注:强>
根据路径,每个级别的结果可能不完全确定,即如果相同的键多次出现,则未指定选择哪个子级。即使存在此路径的后代,这也可能导致路径无法解析 例如:a -> b -> c -> b
如果“b”的分辨率选择,则路径“a.b.c”将成功 第一个这样的节点,但如果选择第二个节点则失败。
我猜你应该在root上使用迭代器来查找最后执行的集合 然后获取对该节点的引用,然后将结果添加到它:
from begin() to end(), find the max result_number or
just the one that matches count()