【问题标题】:QXmlStreamReader reads empty text, document is for sure not emptyQXmlStreamReader 读取空文本,文档肯定不是空的
【发布时间】:2016-02-11 07:30:47
【问题描述】:

我正在使用QXmlStreamReaderQXmlStreamWriter 在我的应用程序中读写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: ' "" ' 

【问题讨论】:

  • 我知道的大多数XmlReader API 在定位在文本节点上时会输出文本,但在定位在起始元素上时不会。因此,如果您想读出内容或数据,那么您可能需要添加对文本节点的检查,然后输出其内容。
  • 参见doc.qt.io/qt-5/qxmlstreamreader.html#text,它表示“返回字符、注释、DTD 或实体引用的文本。”。

标签: c++ xml qt


【解决方案1】:

当你在StartElement 令牌时,你只能得到这个元素的名字,而不是它的值。您需要进一步阅读并访问Characters 令牌才能读取元素的值。您还想跳过纯空格标记:

while (!xmlReader.atEnd() && !xmlReader.hasError())
{
    xmlReader.readNext();
    //here we are at StartElement, so we can read the element's name
    if (xmlReader.isStartElement())
    {
        qDebug() << "element name: '" << xmlReader.name().toString() << "'";
    }
    //here we are inside the element, so if it is not empty, we can read the element's value
    else if(xmlReader.isCharacters() && !xmlReader.isWhitespace())
    {
        qDebug() << "element value: '" <<xmlReader.text().toString() << "'";
    }
}

【讨论】:

  • 感谢您的解释和示例。现在可以了。
猜你喜欢
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 2011-03-30
相关资源
最近更新 更多