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

これは、ブーストメーリングリストへの私の返信のコピー/貼り付けです。

あなたはここですべてを誤解していると思います。

xpathがであるノードがたくさんありますがroot/result_set、それらすべてにそれらを識別する属性があります result_number

電話をかけるget_childと、任意のノードを取得します(ブーストドキュメントから):

self_type & get_child(const path_type & path) ;

指定されたパスで子を取得するか、をスローしptree_bad_pathます。

注:
パスによっては、各レベルでの結果が完全に確定しない場合があります。つまり、同じキーが複数回表示される場合、どの子が選択されるかは指定されません。これにより、このパスの子孫が存在する場合でも、パスが解決されない可能性があります。
例:

  a -> b -> c
    -> b

パス「abc」は、「b」の解決が最初のそのようなノードを選択した場合は成功しますが、2番目のノードを選択した場合は失敗します。

ルートでイテレータを使用して最後に実行されたセットを見つけ、そのノードへの参照を取得して、そのノードに結果を追加する必要があると思います。

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