QT:读取xml文件并使用DOM解析器解析它

时间:2015-11-26 10:00:19

标签: c++ xml qt dom

我对xml不太好,但我的基本xml文件看起来像这样。

<MAIN_HEADER>

  <HEADER>
    <TITLE>my_title</TITLE>
    <AUTOR>DNL</AUTOR>
    <NAME>John</NAME>
    <AGE>abc</AGE>
    <SEX>male</SEX>
    <PLACE>abc</PLACE>
    <INI_FILE>abc</INI_FILE>

  </HEADER>

我想要做的是,我需要找到2-3个标签,例如NAME&amp;性别 并将属性(John,Male)存储在另一个变量中。

直到现在,我已经能够让它读取xml文件了。

void MainWindow::XMLParser()
{
        QString path=MainWindow::getWorkingDirectory()+"\\0_Config\\";
        QString string;
        string = path + ui->ConfigFiles_combo->currentText(); \\THIS IS WHERE´IT DETERMINES WHICH XML FILE IT IS
        qDebug()<<string;
        QDomDocument document;
        //load the file
        QFile file(string);
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            qDebug()<<"Failed to open the file";

        }

        else
        {
            if(!document.setContent(false))
            {
                qDebug()<<"Failed to load document";

            }
            file.close();
        }
        QDomElement root = document.firstChildElement();
        qDebug()<<"finished";

}

如何让它搜索确切的标签并将其存储在另一个变量中?

2 个答案:

答案 0 :(得分:2)

为什么你再次拥有setContent(false)?您似乎刚刚复制了 The Badger 的代码。试试这个。

void MainWindow::XMLParser()
{
    // don't worry about path separator, Qt will take of it
    QString string = MainWindow::getWorkingDirectory() + "/0_Config/" + ui->ConfigFiles_combo->currentText();
    qDebug()<<string;
    QDomDocument document;
    //load the file
    QFile xmlFile(string);
    if (!xmlFile.exists() || !xmlFile.open(QFile::ReadOnly | QFile::Text)) {
        qDebug() << "Check your file";
        return;
    }
    QDomDocument domDocument;
    domDocument.setContent(&xmlFile);
    QDomElement topElement = domDocument.documentElement();
    QDomNode domNode = topElement.firstChild();
    while (!domNode.isNull()) {
        QDomElement domElement = domNode.toElement();
        if (!domElement.isNull()) {
            //qDebug() << domElement.tagName();
            if (domElement.tagName() == "HEADER") {
                QDomNode node = domElement.firstChild();
                while (!node.isNull()) {
                    QDomElement element = node.toElement();
                    if (!element.isNull()) {
                        const QString tagName(element.tagName());
                        if (tagName == "NAME") {
                            qDebug() << "Name is:" << element.text();
                        } else if (tagName == "SEX") {
                            qDebug() << "Sex is:" << element.text();
                        }
                    }
                    node = node.nextSibling();
                }
            }
        }
        domNode = domNode.nextSibling();
    }
}

这是我的控制台输出

Name is: "John"
Sex is: "male"
Name is: "Doe"
Sex is: "male"

答案 1 :(得分:0)

看看QDomDocument文档,示例应该足够好了:我在假设文件被打开(你的setContent()函数调用不正确)。

if (document.setContent(&file) == false) {
    file.close();
    return;
}
QDomElement docElem = doc.documentElement();

QDomElement headerElement = docElem.firstChildElement("HEADER");
if(headerElement.isNUll() == true) {
    return;
}
/* Get the name */
QDomElement nameElement = headerElement.firstChildElement("NAME");
QString name = nameElement.text();

/* Get the sex */
QDomElement sexElement = headerElement.firstChildElement("SEX");
QString sex = sexElement.text();

编辑:查看QDomElement上的文档,还有一些代码也可以使用。我上面的代码看起来类似于描述中的最后一个代码段。