c++ - 如何在没有任何其他修改的情况下在 C++ 中对 XML 字符串进行 "pretty print"处理?

标签 c++ xml qt boost xml-parsing

如何使用 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属性(property)完全和转型"UTF-8"为小写。

有没有办法只是格式化 XML 字符串而不修改 任意 里面有非空白字符吗?
例如,就像 Notepad++ 的 XML 工具插件一样。

最佳答案

你可以试试QXmlFormatter ,另一种在 Qt 中格式化 XML 的方法。至少从文档来看,它的目的似乎只是插入换行符和空格字符,而不是以其他方式修改 XML。 (不过,我没有在测试中验证。)
QXmlFormatter 适用于 QXmlQuery 输出,因此您必须使用不会更改其输入的假 XQuery。

关于c++ - 如何在没有任何其他修改的情况下在 C++ 中对 XML 字符串进行 "pretty print"处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59057184/

相关文章:

c++ - ifstream 读取失败

c++ - 程序在 Visual Studio 2010 上编译但不在 VS 2015 上编译

html - SSRS 中 HTML 的 Spacebefore 和 Spaceafter

Java:解析XML并将所有数据内容绑定(bind)到Map <K, V>

python - 使用 self.sender() 检查 PyQt QPushButton 是否被检查

c++ - SSE 和 C++ 容器

c# - .net current Process.MainModule 的 C++ 等价物是什么?

xml - 使用 CFSCRIPT 获取 xml 属性

c++ - 为什么不支持 QCamera::CaptureVideo?

qt - 从 Qt 5.3 代码中的任何位置获取 QML 根对象