在C 或QT中格式化XML文件



我有一个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文件已经存在,但是现在我必须如上所述格式化。

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

如果您使用的是QT,则可以使用QXMLStreamReader读取它并使用QXMLStreamWriter编写,或将其解析为QDOMDOCUMEMEN,然后将其转换回QString。QXMLStreamWriter和QdomDocument支持格式。

如果您想要一个不依赖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 包装器中感兴趣的Libxml2吗?

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

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

利用C 您可以在>&lt的每个实例之间添加一个字符;用于输出:通过更改>&lt;到> n&lt;(这添加了新线的非打印字符)每个标签将在新线路上打印。但是,如上所述,有API可以执行此操作,但是对于一种简单的方法来执行您建议的控制台输出,或者使XML在文本编辑器之类的内容中流向每个标签的新线条, n应该可以正常工作。

如果您需要更优雅的输出,则可以使用n(NEWLINE)和t(TAB)自己编码方法来布置输出,或者如果您更精致的表示形式,则可以使用API。

<</p> <。

相关内容

  • 没有找到相关文章

最新更新