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);
}
Другие вопросы по тегам