2011-07-04 35 views
27

Tôi đang sử dụng boost :: property_tree để đọc và ghi các tệp cấu hình XML trong ứng dụng của mình. Nhưng khi tôi viết tệp, đầu ra trông có vẻ xấu xí với nhiều dòng trống trong tệp. Vấn đề là nó phải được chỉnh sửa bởi con người vì vậy tôi muốn có được kết quả tốt hơn.boost :: property_tree XML in đẹp

Như một ví dụ tôi đã viết một chương trình thử nghiệm nhỏ:

#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 chứa:

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

sau khi chạy các chương trình file2.xml chứa:

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



    <net> 



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

Is có một cách để có một đầu ra tốt hơn, khác hơn là đi bằng tay thông qua đầu ra và xóa các dòng sản phẩm nào?

+2

boost :: property_tree sử dụng một phân tích cú pháp XML gọi RapidXML, http://rapidxml.sourceforge.net/. Cả hai tăng :: property_tree và RapidXML được duy trì bởi Marcin Kalicinski. Tôi đề nghị bạn liên lạc trực tiếp với anh ấy. Bạn có thể tìm thấy địa chỉ thư của mình trên trang chủ RapidXML. – user763305

+0

cảm ơn ildjarn để chỉnh sửa, nhưng các dòng trống ở đây vì một lý do!Câu hỏi Btw được hỏi cho người duy trì, tôi sẽ đăng câu trả lời nếu có một – foke

Trả lời

39

Giải pháp là để thêm trim_whitespace cờ để cuộc gọi đến read_xml:

#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; 
} 

Lá cờ được ghi chép lại here nhưng nhà duy trì hiện tại của thư viện (Sebastien Redl) là loại, đủ để trả lời và chỉ cho tôi nó.

+1

Cảnh báo: trim_whitespace không chỉ cắt bớt khoảng trắng trong XML, mà còn khoảng trắng trong bất kỳ phần tử nào không chứa các phần tử khác: ' xx ' như thể nó là ' xx '. –

+7

Thật kỳ lạ khi người ta cần phải thay đổi cài đặt * đọc * để có được điều này (đặc biệt sau khi nhận xét @AndreasHaferburg). Dù sao trong phiên bản hiện tại của Boost one cần sử dụng 'xml_writer_settings ' (không phải 'char'). – alfC

+0

liên kết "tại đây" được cập nhật: http://www.boost.org/doc/libs/1_58_0/doc/html/boost/property_tree/xml_parser/read_xml_idp82929296.html – alfC

3

Câu hỏi này là khá cũ, nhưng tôi điều tra vấn đề của bạn một lần nữa, thời gian gần đây, bởi vì nó đã tồi tệ hơn rất nhiều tại property_tree rằng dịch dòng mới để

Theo tôi đây là một lỗi, bởi vì các yếu tố, trong đó chỉ chứa khoảng trắng - dòng mới, dấu cách và tab, được coi là phần tử văn bản. trim_whitespace chỉ là một dải tần và bình thường hóa tất cả khoảng trắng trong thuộc tính property_tree.

tôi báo cáo lỗi trên đây và cũng kèm theo một .diff để sửa chữa hành vi này trong Boost 1,59 trong trường hợp trim_whitespace không được sử dụng: https://svn.boost.org/trac/boost/ticket/11600

2

Đối với những cố gắng:

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

Biên soạn với tăng -1.60.0 trong VisualStudio 2013, bạn có thể nhận được:

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 

Sau đó kết thúc tại đây:

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

Giải pháp được tìm thấy để làm việc là sử dụng tiêu chuẩn :: chuỗi trong mẫu.

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

như đã mô tả ở đây:

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

Các vấn đề liên quan