Читать XML-узел с RapidXML

0

Я использую RapidXML для анализа XML файлов и чтения содержимого узлов, но я не хочу читать значения внутри узла, мне нужно прочитать содержимое определенных узлов XML "как XML", а не как разобранные значения.

Пример:

<node1>
    <a_lot_of_xml>
      < .... >
    </a_lot_of_xml>
</node1>

Мне нужно получить содержимое node1 как:

<a_lot_of_xml>
    < .... >
</a_lot_of_xml>

Что я устал:

Я пробовал что-то, но, по-моему, это не очень хорошо, его нужно было вставить в node1, путь к другому XML файлу для чтения, мне это понравилось:

<file1ToRead>MyFile.xml</file1ToRead>

И тогда мой c++ код выглядит следующим образом:

ifstream file (FileToRead);

строковый буфер; buffer << file.rdbuf();

Но проблема в том, что у пользователей будет много файлов XML для поддержки, и я просто хочу использовать один XML файл.

Теги:
rapidxml

2 ответа

1
Лучший ответ

Я думаю, что "много XML файлов" - лучший способ, поэтому у вас есть каталог всех xml файлов, вы можете прочитать xml файл, когда вам это нужно, что хорошо для производительности. Вернемся к проблеме, можно использовать функцию quickxml :: print, чтобы получить XML-формат.

bool test_analyze_xml(const std::string& xml_path)
{
    try
    {
        rapidxml::file<> f_doc(xml_path.c_str());  
        rapidxml::xml_document<> xml_doc;
        xml_doc.parse<0>(const_cast<char*>(f_doc.data()));
        rapidxml::xml_node<>* node_1 = xml_doc.first_node("node1"); 
        if(node_1 == NULL)
        {
            return false;
        }
        rapidxml::xml_node<>* plain_txt = node_1->first_node("a_lot_of_xml"); 
        if (plain_txt == NULL)
        {
            return false;
        }
        std::string xml_data;
        rapidxml::print(std::back_inserter(xml_data), *plain_txt, rapidxml::print_no_indenting);  //the xml_data is XML format.
    }
    catch (...)
    {
        return false;
    }
    return true;
}
  • 0
    Спасибо, очень полезный ответ! Я попробовал и отлично работает для моего проекта!
0

Я незнаком с quickxml, но я сделал это с tinyxml2. Трюк состоит в том, чтобы зачитать узел1, а затем создать новый XMLDoc (используя здесь условия tinyxml2), который содержит все внутри узла1. Оттуда вы можете использовать свой класс XMLPrinter для преобразования нового XMLDoc (содержащего все в node1) в строку.

tinyxml2 - это бесплатная загрузка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню