在 C++ 或 Qt 中格式化 XML 文件

Posted

技术标签:

【中文标题】在 C++ 或 Qt 中格式化 XML 文件【英文标题】:Format XML file in c++ or Qt 【发布时间】:2012-12-19 06:30:52 【问题描述】:

我有一个 XML 文件,其中的输出没有被格式化。这意味着所有输出都在一行中,但我想逐个标记。

例如-

<?xml version="1.0" encoding="UTF-8" standalone="no" ?><Analyser>   <JointDetails>              <Details><StdThickness> T </StdThickness><Thickness_num> 0.032 </Thickness_num></Details>   </JointDetails></Analyser>

但我想这样做::

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Analyser>  
 <JointDetails>
   <Details>
<StdThickness> T </StdThickness>
<Thickness_num> 0.032 </Thickness_num>
</Details> 
  </JointDetails>
</Analyser>

请不要在编写 XML 文件时这样做,因为这个 XML 文件已经存在,但现在我必须按照上面提到的方式对其进行格式化。

【问题讨论】:

用TinyXML读取XML,用TiXMLPrinter打印出来,默认是漂亮打印。 【参考方案1】:

使用QXmlStreamReaderQXmlStreamWriter 应该可以满足您的需求。 QXmlStreamWriter::setAutoFormatting(true) 将在不同的行上格式化 XML 并使用正确的缩进。使用QXmlStreamReader::isWhitespace(),您可以过滤掉标签之间多余的空白。

QString xmlIn = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>"
                "<Analyser><JointDetails>              <Details><StdThickness>"
                " T </StdThickness><Thickness_num> 0.032 </Thickness_num>"
                "</Details>   </JointDetails></Analyser>";
QString xmlOut;

QXmlStreamReader reader(xmlIn);
QXmlStreamWriter writer(&xmlOut);
writer.setAutoFormatting(true);

while (!reader.atEnd()) 
    reader.readNext();
    if (!reader.isWhitespace()) 
        writer.writeCurrentToken(reader);
    


qDebug() << xmlOut;

【讨论】:

感谢您的回复。但它在第二次迭代中中断。 打破是什么意思?你的程序崩溃了吗?或者你得到了意想不到的输出?这个测试程序应该打印出你想要的输出:gist.github.com/4343585 你程序崩溃了。 @viku:您能否提供有关您所遇到的崩溃的更多详细信息(回溯、错误消息...)?【参考方案2】:

如果您使用的是 Qt,您可以使用 QXmlStreamReader 读取它并使用 QXmlStreamWriter 写入它,或者将其解析为 QDomDocument 并将其转换回 QString。 QXmlStreamWriter 和 QDomDocument 都支持格式化。

【讨论】:

【参考方案3】:

如果你想要一个不依赖 QT 的简单健壮的解决方案,你可以使用 libxml2。 (如果您仍然使用 QT,请使用 Frank Osterfeld 所说的内容。)

xmlDoc* xdoc = xmlReadFile(BAD_CAST"myfile.xml", NULL, NULL, 0);
xmlSaveFormatFile(BAD_CAST"myfilef.xml", xdoc, 1);
xmlFreeDoc(xdoc);

您可以关注我的C++ wrapper of libxml2吗?

编辑: 如果内存中有 XML 字符串,也可以使用 xmlReadDoc...But it doesn't stop there.

【讨论】:

【参考方案4】:
void format(void)

    QDomDocument input;

    QFile inFile("D:/input.xml");
    QFile outFile("D:/output.xml");

    inFile.open(inFile.Text | inFile.ReadOnly);
    outFile.open(outFile.Text | outFile.WriteOnly);

    input.setContent(&inFile);

    QDomDocument output(input);
    QTextStream stream(&outFile);
    output.save(stream, 2);

【讨论】:

【参考方案5】:

利用 C++,您可以在 >\n

如果您需要更优雅的输出,您可以自己编写一个方法,使用\n(换行符)和\t(制表符)来布置您的输出,或者如果您需要更精细的表示,则可以使用 API。

【讨论】:

实际上我想将上述输出存储到文件中。但我认为 \n 仅适用于控制台。您能否建议将其存储在文件中。 您如何流式传输到文件?例如,如果您将 xml 字符串保存为文本文件,\n 也可以使用,所以您也应该这样。我想你可以使用一个额外的 API 来美化你的 xml 输出,但是,编写你自己的系统的好处是你可以看到一切是如何工作的;而且,您可以根据自己的目的编写尽可能小而高效的系统。它真的很适合课程,但如果您需要更详细的答案,我会尽力而为,只需要一些关于您如何实际将内容保存到文件的额外信息。 :)

以上是关于在 C++ 或 Qt 中格式化 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

C++ 如何解析xml格式的字符串信息,不是文件中的

c# 用XML保存控件的位置、大小等信息,XML格式如下,求写XML文件的函数,要具体代码

Qt C++ 等效于具有自定义格式的 C# toString

2021-04-15qt对XML文件的使用

QT软件开发之基础控件--2.3 QT资源文件

Qt 操作Json格式文件(创建插入解析修改删除)