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

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

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

如何解析得到id的值?

std::string id = ...;

【问题讨论】:

标签: c++ xml qt xml-parsing


【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-11
      • 2012-10-06
      • 1970-01-01
      • 2011-05-18
      • 2017-12-22
      • 2016-11-17
      • 2013-07-17
      • 2013-01-10
      相关资源
      最近更新 更多