首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取StartElement (QXmlStreamReader)中的XML标记

读取StartElement (QXmlStreamReader)中的XML标记
EN

Stack Overflow用户
提问于 2018-04-23 16:01:31
回答 1查看 2.1K关注 0票数 2

因此,我试图阅读一个中等大小的XML文档。它的结构如下:

代码语言:javascript
复制
<project identifier="project1">
    <author>Joe Smith</author>
    <author2>Rick Jones</author2>
    <path>projects/internal/project2</path>
    <version>1.51</version>
</project>
<project identifier="project2">
     <author>Terry Chimes</author>
     <author>Janie Jones</author>
     <path>projects/external/project2</path>
     <version>19.77</version>
</project>

..。以此类推,为几百个项目。

我使用的是Qt5.10的QXmlStreamReader,它可能是由散热器创建的(或记录在案的)。

我可以通过使用project -或者逐个标记读取标记来找到每个xmlReader.readNextStartElement,直到我找到一个具有内部属性的标签(只有project标记在这个文件中有属性)。

但是,当我读到这些父元素之一时,QXmlStreamReader就会将每个标记吸收到它的结束的</project>标记。问题是,我需要获取其中的一些数据,在本例中,是<path></path>标记中的内容。

我可以使用xmlReader.readElementText(QXmlStreamReader::IncludeChildElements检索所有被放大的数据,但这只是一个没有标记的大数据转储。

有人知道我如何“倒带”并读取内部标签吗?或者阻止流读取器蹒跚向前,吸收所有的数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-24 07:49:45

最有可能的解释是,您做错了什么,QXmlStreamReader在解析文档时不应该跳过内部元素。您没有提供任何源代码,所以不可能知道您到底做错了什么。

下面是我的代码示例,它与macOS 10.13.2上的QT5.9.2非常相似:

代码语言:javascript
复制
#include <QCoreApplication>
#include <QDebug>
#include <QXmlStreamReader>
#include <QFile>
#include <QHash>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    if (argc != 2) {
        qWarning() << "Usage: " << argv[0] << " <file>";
        return 1;
    }

    QFile file(argv[1]);
    if (!file.open(QIODevice::ReadOnly)) {
        qWarning() << "Failed to open file " << argv[1] << " for reading";
        return 1;
    }

    QXmlStreamReader reader(&file);
    QString currentProjectId;
    QHash<QString,QString> pathByProjectId;
    while(!reader.atEnd())
    {
        reader.readNext();

        if (reader.isStartDocument()) {
            continue;
        }

        if (reader.isEndDocument()) {
            break;
        }

        if (reader.isStartElement())
        {
            QStringRef elementName = reader.name();
            if (elementName == "project") {
                QXmlStreamAttributes attrs = reader.attributes();
                currentProjectId = attrs.value("identifier").toString();
            }
            else if (elementName == "path") {
                pathByProjectId[currentProjectId] = reader.readElementText(QXmlStreamReader::IncludeChildElements);
            }

            continue;
        }
    }

    for(auto it = pathByProjectId.constBegin(),
        end = pathByProjectId.constEnd(); it != end; ++it)
    {
        qDebug() << "Path for project " << it.key() << ": " << it.value();
    }

    file.close();

    return 0;
}

下面是您的一个稍微修改过的示例,我将它提供给这个示例程序:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<body>
<project identifier="project1">
    <author>Joe Smith</author>
    <author2>Rick Jones</author2>
    <path>projects/internal/project1</path>
    <version>1.51</version>
</project>
<project identifier="project2">
     <author>Terry Chimes</author>
     <author>Janie Jones</author>
     <path>projects/external/project2</path>
     <version>19.77</version>
 </project>
 </body>

我在您的示例中添加了XML /encoding声明+高级body标记,以防止QXmlStreamReader认为第一个project标记是整个文档的根元素。我还更改了第一个项目的路径,使其不同于第二个项目的路径。

这是我得到的输出:

代码语言:javascript
复制
Path for project  "project1" :  "projects/internal/project1"
Path for project  "project2" :  "projects/external/project2"
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49985359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档