如何在不进行任何其他修改的情况下"pretty print" C++的XML字符串?

How to "pretty print" an XML string in C++ without ANY other modifications?

本文关键字:情况下 pretty print C++ 字符串 XML 修改 其他 任何      更新时间:2023-10-16

如何使用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字符串而不修改其中的任何非空格字符? 例如,就像记事本++的XML工具插件一样。

您可以尝试QXmlFormatter,这是在Qt中格式化XML的另一种方法。至少从文档中看,它的目的似乎只是插入换行符和空格字符,而不是以其他方式修改 XML。(不过,我没有在测试中验证。

QXmlFormatter适用于QXmlQuery输出,因此您必须使用不会更改其输入的假XQuery。