如何使用Qt或boost在C ++中“漂亮打印” XML字符串?
我有这样的输入:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Something property1="A" property2="B"><Value>42</Value></Something>
我想收到这个:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Something property1="A" property2="B">
<Value>42</Value>
</Something>
听起来像一个非常简单的任务,但是我很难使用Qt或boost来正确解决它。
当我尝试使用QDomDocument
QDomDocument dom_document;
dom_document.setContent(unformatted_xml);
QString formatted_xml = dom_document.toString(4);
既弄乱了引号(https://forum.qt.io/topic/68098/issue-with-qdomdocument-setcontent-and-xml-declaration-attribute-quotes)并交换了一些属性(例如,property2
可能最终出现在之前 property1
)
当我尝试使用boost::property_tree
using boost::property_tree::ptree;
ptree pt;
std::istringstream iss{i_unformatted_xml};
read_xml(iss, pt, (boost::property_tree::xml_parser::trim_whitespace | boost::property_tree::xml_parser::no_concat_text));
boost::property_tree::xml_writer_settings<std::string> settings{' ', 4};
std::ostringstream result_oss;
write_xml(result_oss, pt, settings);
它弄乱了标题,完全删除了其standalone
属性,并将"UTF-8"
转换为小写。
有没有一种方法可以仅格式化XML字符串而无需修改其中的任何非空白字符? 例如,类似于Notepad ++的XML Tools插件。
答案 0 :(得分:0)
您可以尝试QXmlFormatter,这是Qt中格式化XML的另一种方法。至少从文档中看,它的目的似乎是仅插入换行符和空格字符,而不是以其他方式修改XML。 (不过,我没有在测试中验证。)
QXmlFormatter可处理QXmlQuery输出,因此您必须使用不更改其输入的伪XQuery。