用c ++或Qt格式化XML文件

时间:2012-12-19 06:30:53

标签: c++ xml qt xml-formatting

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

提前致谢。

5 个答案:

答案 0 :(得分:7)

使用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;

答案 1 :(得分:2)

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

答案 2 :(得分:1)

如果您想要一个不依赖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.

答案 3 :(得分:1)

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);
}

答案 4 :(得分:0)

利用C ++,您可以在&gt;&lt;的每个实例之间添加单个字符。输出: 通过改变&gt;&lt;到&gt; \ n&lt; (这会为换行添加非打印字符)每个标记将打印到一个新行。然而,如上所述,有一些API方法可以做到这一点,但是为了一个简单的方法来执行你建议的控制台输出,或者使XML在文本编辑器之类的每个标签上流入新行,\ n应该正常工作

如果您需要更优雅的输出,您可以使用\n(换行符)和\t(制表符)自行编写方法来布局输出,或者如果您需要更多输出,则可以使用api精心设计的代表。