2011-07-04 17 views
27

Uygulamamda XML yapılandırma dosyalarını okumak ve yazmak için boost :: property_tree kullanıyorum. Ancak dosyayı yazdığımda, çıktı çok fazla boş satırlarla dosyada çirkin görünüyor. Sorun, insanlar tarafından düzenlenmesinin gerekmesi dolayısıyla daha iyi bir çıktı elde etmek istiyorum.boost :: property_tree XML güzel yazdırma

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 

int main(void) 
{ 
    using boost::property_tree::ptree; 
    ptree pt; 

    // reading file.xml 
    read_xml("file.xml", pt); 

    // writing the unchanged ptree in file2.xml 
    boost::property_tree::xml_writer_settings<char> settings('\t', 1); 
    write_xml("file2.xml", pt, std::locale(), settings); 

    return 0; 
} 

file.xml içerir:: Örnek olarak

Ben küçük bir test programı yazdım programı file2.xml çalıştırdıktan sonra

<?xml version="1.0" ?> 
<config> 
    <net> 
     <listenPort>10420</listenPort> 
    </net> 
</config> 

içerir:

<?xml version="1.0" encoding="utf-8"?> 
<config> 



    <net> 



     <listenPort>10420</listenPort> 
    </net> 
</config> 

mi çıktıdan el ile geçmek ve boş satırları silmek dışında, daha iyi bir çıktıya sahip olmanın bir yolu var mı?

+2

boost :: property_tree RapidXML, http://rapidxml.sourceforge.net/ denilen bir XML ayrıştırıcı kullanır. Hem boost :: property_tree ve RapidXML, Marcin Kalicinski tarafından yapılmaktadır. Doğrudan onunla bağlantı kurmanı öneririm. Posta adresini RapidXML ana sayfasında bulabilirsiniz. – user763305

+0

Düzenleme için ildjarn teşekkürler, ama boş satırlar bir sebepten dolayı burada!Btw soru bakıcı sordu, ben bir – foke

cevap

39

çözüm read_xml çağrısına trim_whitespace bayrağı eklemek oldu:

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 

int main(void) 
{ 
    // Create an empty property tree object 
    using boost::property_tree::ptree; 
    ptree pt; 

    // reading file.xml 
    read_xml("file.xml", pt, boost::property_tree::xml_parser::trim_whitespace); 

    // writing the unchanged ptree in file2.xml 
    boost::property_tree::xml_writer_settings<char> settings('\t', 1); 
    write_xml("file2.xml", pt, std::locale(), settings); 

    return 0; 
} 

bayrağı here belgelenmiştir ancak kütüphanede (Sebastien Redl) mevcut sürdürücü yanıtlamak ve bana gelin nezaketini o.

+1

varsa cevap yazacağım Uyarı: trim_whitespace sadece XML içinde boşlukları düzeltir, aynı zamanda diğer öğeleri içermeyen herhangi bir öğede beyaz boşluklar: ' xx' okundu xx 'gibi. –

+7

Biri bunu okumak için * read * ayarlarının değiştirilmesi gerektiğinde gariptir (özellikle @AndreasHaferburg yorumundan sonra). Zaten Boost'un şu anki sürümünde 'xml_writer_settings '(' char' değil) kullanılmalıdır. – alfC

+0

"burada" bağlantısı güncelleştirildi: http://www.boost.org/doc/libs/1_58_0/doc/html/boost/property_tree/xml_parser/read_xml_idp82929296.html – alfC

3

Bu soru oldukça eski, ama çok daha kötü var çünkü şimdi bu property_tree Bence bu bir hata olduğunu ise

için yeni satır çevirir, son zamanlarda, yine sorununuzu araştırdık elemanları, çünkü hangi sadece boşluk içeriyor - yeni satırlar, boşluklar ve sekmeler, metin öğeleri olarak ele alınır. trim_whitespace sadece bir bandaid ve property_tree'deki ALL boşluğunu normalleştirir.

Buraya hata bildirdi ve ayrıca kullanılmayan durumda trim_whitespace Hızlandırmak 1.59 bu davranışı düzeltmek Bir .diff ekli:

boost::property_tree::xml_writer_settings<char> settings('\t', 1); 

artırma ile derleniyor: O çalıştıkları için https://svn.boost.org/trac/boost/ticket/11600

2

-1.60.0 VisualStudio 2013'te sen alabilirsiniz:

vmtknetworktest.cpp(259) : see reference to class template instantiation 'boost::property_tree::xml_parser::xml_writer_settings<char>' being compiled 
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(38): error C2039: 'value_type' : is not a member of '`global namespace'' 
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(38): error C2146: syntax error : missing ';' before identifier 'Ch' 
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(38): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(40): error C2061: syntax error : identifier 'Ch' 
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(49): error C2146: syntax error : missing ';' before identifier 'indent_char' 
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(49): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C2825: 'Str': must be a class or namespace when followed by '::' 
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C2039: 'size_type' : is not a member of '`global namespace'' 
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C2146: syntax error : missing ';' before identifier 'indent_count' 
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
vmtknetworktest.cpp(259): error C2661: 'boost::property_tree::xml_parser::xml_writer_settings<char>::xml_writer_settings' : no overloaded function takes 3 arguments 

Sonra burada sona:

işe bulundu etmek

https://svn.boost.org/trac/boost/ticket/10272

Çözüm şablonunda std :: string kullanmaktır.

pt::write_xml(file_name, params, std::locale(), pt::xml_writer_make_settings<std::string>(' ', 4)); 

burada açıklandığı şekilde:

https://stackoverflow.com/a/35043551/7170333

İlgili konular