2012-04-22 3 views
1

Я пишу набор результатов в файл XML. Каждый набор результатов содержит ряд результатов. Моя проблема в том, что (во время нескольких исполнений кода), когда я пытаюсь записать некоторые новые результаты, результат в набор, парсер XML получает самый первый (верхний) результат в существующем файле XML и добавляет результаты к этому (старый). Например:Добавить дочерний узел в начало структуры XML. Boost Property Tree

<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

Это копирование/вставка моего ответа на список рассылки подталкивание:

Я думаю, вы непонимании все это здесь.

У вас есть много узлов, чей XPath является корень/result_set, но все их имеют атрибут, который идентифицирует их: RESULT_NUMBER

При вызове get_child вы получаете произвольный узел (от повышающего документации) :

self_type & get_child(const path_type & path) ; 
    Get the child at the given path, or throw ptree_bad_path. 

    Notes: 
    Depending on the path, the result at each level may not be 
    completely determinate, i.e. if the same key appears 
    multiple times, which child is chosen is not specified. 
    This can lead to the path not being resolved even though 
    there is a  descendant with this path. Example: 
    a -> b -> c 
     -> b 
The path "a.b.c" will succeed if the resolution of "b" chooses the 

первый такой узел, но не удается, если он выбирает второй.

Я думаю, вы должны использовать итераторы на корню, чтобы найти последний выполненный набор , а затем получить ссылку на этот узел, а затем добавить результаты к нему:

from begin() to end(), find the max result_number or 
    just the one that matches count() 

Ссылка увеличить документ: http://www.boost.org/doc/libs/1_41_0/doc/html/boost/property_tree/basic_ptree.html#id973373-bb

Смежные вопросы