Я использую 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 файл.
Я думаю, что "много 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;
}
Я незнаком с quickxml, но я сделал это с tinyxml2. Трюк состоит в том, чтобы зачитать узел1, а затем создать новый XMLDoc (используя здесь условия tinyxml2), который содержит все внутри узла1. Оттуда вы можете использовать свой класс XMLPrinter для преобразования нового XMLDoc (содержащего все в node1) в строку.
tinyxml2 - это бесплатная загрузка.