7

出力がフォーマットされていない XML ファイルがあります。これは、すべての出力が 1 行にあることを意味しますが、タグごとに分割したいと考えています。

例えば ​​-

<?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

とを使用して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;
于 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(改行) と\t(タブ) を使用して自分でメソッドをコーディングして出力をレイアウトするか、より精巧な表現が必要な場合は API を利用できます。

于 2012-12-19T08:29:43.003 に答える