2015-11-26 114 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