Обход простого документа DOM Xml с использованием RapidXML

Хорошо, ребята, поэтому я использую rapidXML для разбора очень простого XML-документа. Все, что я пытаюсь сделать, это проанализировать данные из документа xml в мою собственную структуру данных. В качестве отправной точки, я хотел бы иметь возможность выводить каждый узел, и данные содержат, в прошлом, я думаю, я могу понять это. Документация для rapidXML, по-видимому, в основном сосредоточена на создании документов XML с использованием rapidXML, однако здесь я просто пытаюсь ее прочесть. Для начала вот мой код (в качестве заметки, прежде чем я продолжу дальше с этой программой, я, конечно, буду загружать XML прямо из файла, не смейтесь!)

#include <cstdlib>
#include <iostream>
#include "Page.h"#include "HashTable.h"#include "TimeStamp.h"#include "AvlTree.h"#include "./rapidxml/rapidxml.hpp"#include "./rapidxml/rapidxml_print.hpp"#include <fstream>
#include <sstream>
#include <vector>using namespace std;
using namespace rapidxml;

char s[] = "<?xml version='1.0' encoding='utf-8'?>""<people>""<person gender='female'>""<fname>Morgan</fname>""<lname>Saxer</lname>""</person>""<person gender='male'>""<fname>Tyler</fname>""<lname>Springer</lname>""</person>""</people>";

void traverse_xml(const std::string& input_xml)
{
vector<char> xml_copy(input_xml.begin(), input_xml.end());
xml_copy.push_back('\0');

xml_document<> doc;
doc.parse<parse_declaration_node | parse_no_data_nodes>(&xml_copy[0]);

string encoding = doc.first_node()->first_attribute("encoding")->value();
cout << "encoding: " << encoding << endl;

xml_node<>* cur_node = doc.first_node("people");

string person_type = cur_node->first_node("person")->first_attribute("gender")->value();
cout << "Gender: " << person_type << endl;

cur_node = cur_node->first_node("person")->first_node("fname");
string attr2 = cur_node->value();
cout << "fname: " << attr2 << endl;

cur_node = cur_node->next_sibling("lname");
attr2 = cur_node->value();
cout << "lname: " << attr2 << endl;

//next person node begins here, this is where I am having the problem

cur_node = cur_node->next_sibling("person"); //this doesn't work, and I don't know what command to use instead
attr2 = cur_node->first_attribute("gender")->value();
cout << "Gender: " << attr2 << endl;
}

int main(int argc, char** argv) {

traverse_xml(s);
return 0;
}

Тем не менее, я получаю вывод:

encoding: utf-8
gender: female
fname: Morgan
lname: Saxer

и это все. Что я ищу, так это:

encoding: utf-8
gender: female
fname: Morgan
lname: Saxer
gender: male

так как это будет началом следующего узла человека.

По сути, я думаю, что мой вопрос можно свести к этому. Есть ли какая-нибудь функция «вверх на один уровень» для rapidXML? Я понимаю, что next_sibling () переносит вас к следующему узлу на том же уровне, но как только вы углубляетесь в какой-то один узел, кажется, нет очевидного способа вернуться обратно. У кого-нибудь есть идеи, как это сделать?

РЕДАКТИРОВАТЬ:
После использования предложенного решения мой код теперь выглядит так:

 void traverse_xml(const std::string& input_xml)
{
vector<char> xml_copy(input_xml.begin(), input_xml.end());
xml_copy.push_back('\0');

xml_document<> doc;
doc.parse<parse_declaration_node | parse_no_data_nodes>(&xml_copy[0]);

xml_node<>* people = doc.first_node("people");
xml_node<>* person = people->first_node("person");

while (person != NULL)
{
cout << "Gender:" << person->first_attribute("gender")->value() << endl;
cout << "fname: " << person->first_node("fname")->value() << endl;
cout << "lname: " << person->first_node("lname")->value() << endl;
person = person->next_sibling("person");
}
}

и сейчас правильно выводит следующее:

gender:female
fname: Morgan
lname: Saxer
gender:male
fname: Tyler
lname: Springer

3

Решение

Ты можешь использовать cur_node->parent() чтобы подняться на уровень, но лично я бы порекомендовал что-то вроде этого:

 xml_node<>* people = doc.first_node("people");
xml_node<>* person = people->first_node("person");

while (person != NULL)
{
... output the person
person = person->next_sibling("person");
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]