У меня есть 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-файл уже существует, но теперь я должен отформатировать его, как указано выше.
Заранее спасибо .
Используя QXmlStreamReader
а также QXmlStreamWriter
должен делать то, что вы хотите. 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, или проанализировать как QDomDocument и преобразовать его обратно в QString. И QXmlStreamWriter, и QDomDocument поддерживают форматирование.
Если вам нужно простое и надежное решение, которое не зависит от QT, вы можете использовать libxml2. (Если вы все равно используете QT, просто используйте то, что сказал Фрэнк Остерфельд.)
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 ++, вы можете добавить один символ между каждым экземпляром>< для вывода:
изменив>< к> \ n< (это добавляет непечатаемый символ для новой строки) каждый тег будет печататься на новой строке. Есть способы API сделать это, как уже упоминалось выше, но для простого способа сделать то, что вы предлагаете для вывода на консоль, или чтобы XML перетекал на новые строки для тега в чем-то вроде текстового редактора, \ n должен работать нормально ,
Если вам нужен более элегантный вывод, вы можете написать метод самостоятельно, используя \n
(новая строка) и \t
(вкладка), чтобы выложить свой вывод, или использовать API, если вы хотите получить более сложное представление.