2015-11-26 81 views
1

我对xml不太好,但我的基本xml文件看起来像这样。QT:读取一个xml文件并使用DOM解析器解析它

<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 & SEX 和属性(约翰,男)存储在另一个变量。

到现在为止,我已经能够使它读取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"; 

} 

我怎么让它搜索精确的标签,并将其存储另一个变量里面?

+0

?如果你使用的是Qt 5,那么应该用[XmlStreamRreader]替换DOM类(http://doc.qt.io/qt-5/qxmlstreamreader.html) –

+0

是的,我正在使用5.5 – user5603723

+0

然后我会建议看看作为文档一部分的XmlStreamReader的示例代码,它应该足以让你开始。否则,如果你真的需要DOM,并且找不到示例或答案,我可能会提供一些 –

回答

2

你为什么还要setContent(false)?看起来像你刚刚复制的代码。尝试这个。

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(); 
    } 
} 

这是您正在使用什么版本的Qt我的控制台输出

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

谢谢!这完全有效。但问题是,循环不停止,不知道在哪里放置break .age是:“5” 名称是:“john”年龄是:“5” 名称是:“john”年龄是:“ 5“ 姓名:”john“年龄:”5“ 姓名:”john“年龄:”5“ – user5603723

+0

@ramtheconqueror,我重新格式化了您的代码,希望您不要介意。 –

+0

@ user5603723,你添加了打印年龄的代码,我猜你是做错了什么。你可以分享一下你已经加了什么 –

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的文档为好,有一些代码,您也可以使用。我的上面的代码看起来类似于描述中的最后一个片段。

+0

谢谢!我觉得我相当接近解决这个问题,我实际上做的是我从XML文件列表中选择一个XML文件,但是当我选择一个程序停止。任何想法为什么?请看我的主代码中的EDIT1。我把所有东西都放在那里。 @The Badger – user5603723