7

我有一个 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 文件已经存在,但现在我必须按照上面提到的方式对其进行格式化。

4

5 回答 5

9

使用QXmlStreamReaderandQXmlStreamWriter应该做你想做的事。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;
于 2012-12-19T11:21:21.373 回答
3

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

于 2012-12-19T08:04:17.670 回答
2

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

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

我可以对我的 libxml2 的 C++ 包装器感兴趣吗?

编辑:如果您碰巧在内存中有 XML 字符串,您也可以使用 xmlReadDoc...但它并不止于此。

于 2012-12-19T08:58:46.907 回答
2
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);
}
于 2012-12-21T05:47:03.907 回答
0

利用 C++,您可以在 >< 的每个实例之间添加单个字符用于输出:通过将 >< 更改为 >\n<(这会为换行添加非打印字符)每个标签将打印到新行。但是,如上所述,有 API 方法可以做到这一点,但是对于一个简单的方法来执行您建议的控制台输出,或者使 XML 在文本编辑器之类的东西中流到每个标签的新行上,\n 应该可以正常工作.

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

于 2012-12-19T08:29:43.003 回答