【发布时间】:2016-02-11 07:30:47
【问题描述】:
我正在使用QXmlStreamReader 和QXmlStreamWriter 在我的应用程序中读写XML 文件。
我的示例 XML 文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Senders>
<Sender>
<Name>COMPANY XYZ</Name>
<Street>Random</Street>
<BuildingNumber>23D</BuildingNumber>
<LocalNumber>123</LocalNumber>
<CityCode>3434-21</CityCode>
<City>New York</City>
</Sender>
</Senders>
它是用我的代码编写的。基本上,我在编写 XML 文件时没有问题,但在写入后尝试读取它们时遇到了一些麻烦。这是我的代码,它打印出空值(XML 文件不为空)。
#include "mainwindow.h"
#include <QApplication>
#include <QtCore>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFile file("../data.xml");
if(file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QXmlStreamWriter xmlWriter(&file);
xmlWriter.setAutoFormatting(true);
xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("Senders");
xmlWriter.writeStartElement("Sender");
xmlWriter.writeTextElement("Name", "COMPANY XYZ");
xmlWriter.writeTextElement("Street", "Random");
xmlWriter.writeTextElement("BuildingNumber", "23D");
xmlWriter.writeTextElement("LocalNumber", "123");
xmlWriter.writeTextElement("CityCode", "3434-21");
xmlWriter.writeTextElement("City", "New York");
xmlWriter.writeEndElement();
xmlWriter.writeEndElement();
file.close();
}
QVector<QString> data;
if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QXmlStreamReader xmlReader(&file);
while (!xmlReader.atEnd() && !xmlReader.hasError())
{
xmlReader.readNext();
if (xmlReader.isStartElement())
{
qDebug() << "element name: '" << xmlReader.name().toString() << "'"
<< ", text: '" << xmlReader.text().toString() << "'" << endl;
}
}
file.close();
}
return a.exec();
}
那么我在读取文件时做错了什么?
我得到的输出:
element name: ' "Senders" ' , text: ' "" '
element name: ' "Sender" ' , text: ' "" '
element name: ' "Name" ' , text: ' "" '
element name: ' "Street" ' , text: ' "" '
element name: ' "BuildingNumber" ' , text: ' "" '
element name: ' "LocalNumber" ' , text: ' "" '
element name: ' "CityCode" ' , text: ' "" '
element name: ' "City" ' , text: ' "" '
【问题讨论】:
-
我知道的大多数
XmlReaderAPI 在定位在文本节点上时会输出文本,但在定位在起始元素上时不会。因此,如果您想读出内容或数据,那么您可能需要添加对文本节点的检查,然后输出其内容。 -
参见doc.qt.io/qt-5/qxmlstreamreader.html#text,它表示“返回字符、注释、DTD 或实体引用的文本。”。