c++ - 如何在没有任何其他修改的情况下在 C++ 中“漂亮地打印”一个 XML 字符串?
问题描述
如何使用 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 插件一样。
解决方案
您可以尝试QXmlFormatter,这是在 Qt 中格式化 XML 的另一种方式。至少从文档来看,它的目的似乎只是插入换行符和空格字符,而不是以其他方式修改 XML。(不过,我没有在测试中验证。)
QXmlFormatter 适用于 QXmlQuery 输出,因此您必须使用不会更改其输入的假 XQuery。
推荐阅读
- sql - VBA 从 Shapes("Textbox 1") 复制所有文本并将其放在一个范围内
- c - 使用 netfilter 时如何从 iph->frag_offset 访问 IP_DF 和 IP_MF
- java - 在当前桌面上创建框架(不是父框架所在的位置)java swing
- coq - 在 Coq 中关闭自动感应原理
- wpf - VB.net WPF 文本块
- linux - Git 尝试访问 index.lock 时出现“只读文件系统”错误
- python - 试图理解作者在这里传达的内容,用 zip(*zip(
- javascript - Datatables json数据在一行上显示所有数据
- javascript - javascript fat arrow vs normal function如何设置`this`?
- javascript - 删除字符不匹配的字符串开头