1

我正在将一组结果写入 XML 文件。每个结果集包含一系列结果。我的问题是(在多次执行代码期间)当我尝试将一些新结果写入集合时,XML 解析器获取现有 XML 文件中的第一个(顶部)结果集,并将结果附加到那个(旧)设置。例如:

<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;
}
4

1 回答 1

1

这是我在 boost 邮件列表上的回复的副本/粘贴:

我认为你在这里误解了整个事情。

您有很多 xpath 为 的节点root/result_set,但它们都有一个标识它们的属性: result_number.

当您调用时,get_child您将获得一个任意节点(来自 boost 文档):

self_type & get_child(const path_type & path) ;

让孩子在给定的路径,或 throw ptree_bad_path

注意:
根据路径的不同,每个级别的结果可能不是完全确定的,即如果相同的键出现多次,则未指定选择哪个子级。这可能导致路径无法解析,即使此路径有后代。
例子:

  a -> b -> c
    -> b

如果“b”的解析选择第一个这样的节点,路径“abc”将成功,但如果选择第二个则失败。

我猜你应该在 root 上使用迭代器来查找最后执行的集合,然后获取对该节点的引用,然后将结果添加到它:

   from begin() to end(), find the max result_number or 
   just the one that matches count()
于 2012-04-23T13:50:42.673 回答