2016-12-14 7 views
0

Я использую boost::property_tree для чтения и записи файлов конфигурации xml. Я хочу изменить значение некоторых тегов в моем коде и записать их обратно в файл с некоторым разумным форматированием xml (новые строки, отступы и т. Д.).Убрать дерево свойств (XML) удалить пустые строки

В настоящее время я использую

std::fstream fs("filename"); 
boost::property_tree::ptree pt; 
bpt::xml_parser::read_xml(fs,pt); 

// replace value 
pt.erase("tagname"); 
pt.put("tagname",newval); 

bpt::xml_parser::xml_writer_settings<char> xmlstyle(' ',4); 
bpt::xml_parser::write_xml("filename",pt,std::locale(),xmlstyle); 

Но мне кажется, что каждый раз, когда тег удаляется, он оставляет за собой пустую строку, а после некоторых итераций XML становится нечитаемым. Есть ли способ удалить пустые строки из самого дерева свойств или из полученного XML-файла с помощью boost?

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

ответ

0

Хорошо, это выглядит как ответ уже был там на переполнение стека, я просто не нашел (переводы строк не были упомянуты в посте)

boost::property_tree XML pretty printing

Раствор для чтения файл с boost::property_tree::xml_parser::trim_whitespace

0

Not Boost, но пустые строки в частности. Вы можете использовать std::regex_replace() на выходе перед записью в файл, удаление пустых строк, как этот

std::regex_replace(std::ostreambuf_iterator<char>(fout), text.begin(), text.end(), std::regex("(\\n+)"), "\n"); 

С fout в качестве выходного потока файлов и text в качестве выходных данных в виде std::string.

Это заменяет каждую новую строку, а затем другую новую строку без каких-либо символов между одной новой строкой.

+0

Я вижу, как ваше регулярное выражение заменит избыточные новые строки, если у вас есть выходной поток файла и текст, заданный в виде строки. Но насколько я понимаю, у меня нет ни одного из приведенных выше примеров кода, так как я могу сделать эту работу с образцом кода из моего вопроса? – untergam

+0

Я вижу, что вы уже нашли решение, но я все еще собираюсь рассказать об этом, потому что он может быть полезен в какой-то момент. Вы начинаете с извлечения содержимого файла в 'std :: string text' и затем объявления' std :: stringstream sstream'. Затем вы вызываете вышеупомянутую функцию, но передаете строковый поток вместо потока файлов. Наконец, вы вызываете 'read_xml()' со строковым потоком, а не файловым потоком. – FallenWarrior