boost кропает нестандартные (неправильные) XML-файлы (которые нигде не открываются)

Модератор: Модераторы разделов

Аватара пользователя
жучара
Сообщения: 657
ОС: астралинукс

boost кропает нестандартные (неправильные) XML-файлы

Сообщение жучара »

Друзья! Есть объект дерево (Property Tree), из которого нужно скропать XML-файл, чтобы увидеть аккуратненькое дерево, (наподобие команды tree)

Код: Выделить всё

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
using namespace std;
namespace pt = boost::property_tree;

int main ()
{
    boost::property_tree::ptree test;

    test.put("1", "a");
    test.put("1.1", "b");

    pt::write_xml ("dst.xml", test);
    
    return 0;
}
Файл, который получился:

Shell

$ cat dst.xml
<?xml version="1.0" encoding="utf-8"?>
<1>a<1>b</1></1>
Ни один нормальный открыватель xml-файлов его не откроет, ибо всё в одну строчку. Да и вообще какая-то ерунда. Нужный мне файл должен иметь такое содержание.

Код: Выделить всё

<?xml version="1.0" encoding="UTF-8" ?>
<a>
	<b>
	</b>
</a>  
Ну что уж получается, то и получается. Я бы рад добавлять в дерево узлы вот так:

Код: Выделить всё

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
using namespace std;
namespace pt = boost::property_tree;

int main ()
{
    boost::property_tree::ptree test;

    test.put("a");
    test.put("a.b");
    pt::write_xml ("dst.xml", test);
    
    return 0;
}
Но увы, так не выходит. Ключи ему параметром нужны. Как же сделать из дерева нормальный XML-файл? Спасибо, кто откликнется. Кстати говоря, сам boost в качестве примера использует НОРМАЛЬНЫЕ нормальные XML-файлы, а лепит вот такое.
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
bormant
Сообщения: 1326

Re: boost кропает нестандартные (неправильные) XML-файлы

Сообщение bormant »

Странные выводы... И про "нормальный открыватель", и про одну строчку, и про стандартность. В следующий раз сперва пробуйте, делайте выводы потом.

Про настройку выхлопа ptree не скажу, не знаю.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3724
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: boost кропает нестандартные (неправильные) XML-файлы

Сообщение Hephaestus »

жучара писал(а):
24.09.2020 06:26
Ни один нормальный открыватель xml-файлов его не откроет, ибо всё в одну строчку.
Во-первых, xml-файл имеет полное право быть в одну строчку.
Более того, если требуется, например, подписать xml-файл цифровой подписью в формате xml-dsig,
то его желательно вытянуть в одну строчку, чтобы не затесался лишний перевод строки, влияющий на хэш.

Во-вторых, Ваш "нормальный открыватель" не переваривает Ваш файл не потому, что в одну строчку,
а потому, что нарушен синтаксис: имена тегов не могут начинаться с цифры.
жучара писал(а):
24.09.2020 06:26
Да и вообще какая-то ерунда.
Естественно. Вы, очевидно, перепутали местами имена тегов и содержимое тегов.
жучара писал(а):
24.09.2020 06:26
Но увы, так не выходит. Ключи ему параметром нужны.
Ну так дайте ему эти параметры в чём проблема-то?

Я с boost не знаком, да и с плюсами не очень.
Но пример Ваш я собрал, попробовал разные варианты.

Было у Вас вот так:
жучара писал(а):
24.09.2020 06:26

Код: Выделить всё

test.put("1", "a");
test.put("1.1", "b");
А чтобы получить структуру файла, как Вы привели выше, надо вот так:

Код: Выделить всё

test.put("a.b", "1");
Или если нужны пустые теги, тогда вот так:

Код: Выделить всё

test.put("a.b", "");
Переводов строки там, правда, нет, если уж они нужны, их нужно добавлять отдельно.
Упомянутый Вами "нормальный открыватель" вполне эти файлы переварил. Несмотря на то, что файл в "одну строчку".
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18294
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: boost кропает нестандартные (неправильные) XML-файлы

Сообщение Bizdelnick »

жучара писал(а):
24.09.2020 06:26
Ни один нормальный открыватель xml-файлов его не откроет, ибо всё в одну строчку.
Не потому что в одну строчку, а потому что см.
Добавлено (10:36):
Для красивого форматирования нагуглилось по-быстрому (не проверял):

Код: Выделить всё

pt::write_xml("dst.xml", test, std::locale(), pt::xml_writer_make_settings< pt::ptree::key_type >('\t', 1));
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3724
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: boost кропает нестандартные (неправильные) XML-файлы

Сообщение Hephaestus »

Bizdelnick писал:
24.09.2020 10:11
Для красивого форматирования нагуглилось по-быстрому (не проверял):
Хотел насладиться красивым форматированием, попробовал.
С ходу не взлетело.
Получилось вот так:

Код: Выделить всё

pt::write_xml("dst.xml", test, std::locale(), pt::xml_writer_make_settings< boost::property_tree::ptree::key_type >('\t', 1));
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали: