Rapidxml, как изменить формат тега при выводе пустого элемента
Я использую библиотеку rapidxml, чтобы читать / анализировать содержимое из XML-файла, вносить некоторые изменения в содержимое DOM, а затем снова сохранять DOM в файл.
Когда я сохраняю содержимое xml_document в файл, элементы, содержащие пустую строку, сохраняются как <empty_tag/>
но вместо этого я хочу, чтобы они были сохранены как <empty_tag><empty_tag/>
, Можно ли изменить это с rapidxml?
Поток что-то вроде:
//read the xml content
rapidxml::xml_document<> dom;
std::ifstream i_xmlfile('path');
std::vector<char> xml_content = std::vector<char>(std::istreambuf_iterator<
char>(i_xmlfile), std::istreambuf_iterator<char>());
xml_content.push_back('\0');
dom.parse<0 | rapidxml::parse_no_data_nodes> (&xml_content[0]);
... process nodes here ...
//save the xml content
std::ofstream o_xmlfile;
o_xmlfile.open('path');
o_xmlfile << dom;
1 ответ
После более тщательного поиска в коде библиотеки я пришел к выводу, что изменить этот формат невозможно, только если вы отредактируете библиотеку.
Итак, чтобы заставить его работать, я изменил некоторые строки в файле rapidxml_print.hpp для метода print_element_node()
(строки 283 в rapidxml версии 1.13):
// Print childless node tag ending
*out = Ch('/'), ++out;
*out = Ch('>'), ++out;
изменено с:
*out = Ch('>'), ++out;
// Print node end
*out = Ch('<'), ++out;
*out = Ch('/'), ++out;
out = copy_chars(node->name(), node->name() + node->name_size(), out);
*out = Ch('>'), ++out;
У меня есть вилка с исправленной реализацией для явного объявления самозакрывающегося тега: https://sourceforge.net/p/tacklelib/3dparty--rapidxml/HEAD/tree/branches/
Пример:
for (rapidxml::xml_node<> * node = ...; node; node = node->next_sibling())
{
node->flags(node->flags() & ~rapidxml::node_self_closed_tag);
}