在 Qt 中解析 XML 文件

Posted

技术标签:

【中文标题】在 Qt 中解析 XML 文件【英文标题】:Parse a XML file in Qt 【发布时间】:2011-03-06 18:19:42 【问题描述】:

假设我有一个这样的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<name>
    <id>1</id>
</name>

如何解析得到id的值?

std::string id = ...;

【问题讨论】:

谷歌提供了这个链接:digitalfanatics.org/projects/qt_tutorial/chapter09.html。这对你有帮助吗? 【参考方案1】:

我制作了@Scrivener 答案的简化版本。我没有从文件中读取,而是从 QString 变量中读取并删除了 continue; 块:

QString xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
              "<name>\n"
              " <id>1</id>\n"
              "</name>\n";

QXmlStreamReader reader(xml);
while(!reader.atEnd() && !reader.hasError()) 
    if(reader.readNext() == QXmlStreamReader::StartElement && reader.name() == "id") 
        qDebug() << reader.readElementText();
    

【讨论】:

【参考方案2】:

这样的事情会起作用:

xmlFile = new QFile("xmlFile.xml");
        if (!xmlFile->open(QIODevice::ReadOnly | QIODevice::Text)) 
                QMessageBox::critical(this,"Load XML File Problem",
                "Couldn't open xmlfile.xml to load settings for download",
                QMessageBox::Ok);
                return;
        
xmlReader = new QXmlStreamReader(xmlFile);


//Parse the XML until we reach end of it
while(!xmlReader->atEnd() && !xmlReader->hasError()) 
        // Read next element
        QXmlStreamReader::TokenType token = xmlReader->readNext();
        //If token is just StartDocument - go to next
        if(token == QXmlStreamReader::StartDocument) 
                continue;
        
        //If token is StartElement - read it
        if(token == QXmlStreamReader::StartElement) 

                if(xmlReader->name() == "name") 
                        continue;
                

                if(xmlReader->name() == "id") 
                    qDebug() << xmlReader->readElementText();
                
        


if(xmlReader->hasError()) 
        QMessageBox::critical(this,
        "xmlFile.xml Parse Error",xmlReader->errorString(),
        QMessageBox::Ok);
        return;


//close reader and flush file
xmlReader->clear();
xmlFile->close();

【讨论】:

以上是关于在 Qt 中解析 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

QT开发(四十一)——XML文件解析基础

Qt解析多级xml文件

为啥我不能使用 Qt 中的 QXmlStreamReader 解析 XML 文件?

Qt---Xml文件解析

12.5.2 解析XML文件相关类介绍

QT开发(四十二)——DOM方式解析XML