2012-03-21 31 views
6

我有一個應用程序構建一個基於樹Qt組件的左側菜單。爲了加載它,我需要解析一個XML文件。 XML文件如下所示:使用Qt DOM更新XML文件

<comandos> 
     <categoria> 
       <nome>Cupom fiscal</nome> 
       <comando> 
         <nome>01 - Abrir Cupom Fiscal</nome> 
         <env>3</env> 
         <rec>4</rec> 
         <desc>CNPJ/CPF : </desc> 
         <desc>Nome : </desc> 
         <desc>Endereco: </desc> 
       </comando> 
     </categoria> 
</comandos> 

我實際上可以使用QtDOM讀取此XML。

QDomDocument doc("ComandosML"); 

    QFile file("comandos.xml"); 

    int r = 0; 

    datafields.clear(); 
    receFields.clear(); 
    categories.clear(); 

    if(!file.open(QIODevice::ReadOnly)) 
     return -1; 

    if(!doc.setContent(&file)) 
    { 
     file.close(); 
     return -2; 
    } 

    // Ok we are ready to parse DOM 
    QDomElement root = doc.documentElement(); 
    if(root.tagName() != "comandos") 
     return -3; 

    QDomNode n = root.firstChild(); 
    while(!n.isNull()) 
    { 
      QDomElement e = n.toElement(); 
      if(!e.isNull()) 
      { 
      if(e.tagName() == "categoria") 
      { 
       QDomNode cat = n.firstChild(); 
       while(!cat.isNull()) 
       { 
        QDomElement CatName = cat.toElement(); 

        if (CatName.tagName() == "nome") 
        { 
         QString s = CatName.text(); 

         if (s != "") 
         { 
          categories.push_back(s); 
          item = new QStandardItem((s)); 
          item->setEditable(false); 
         } 
        } 

        if (CatName.tagName() == "comando") 
        { 

         QDomNode params = cat.firstChild(); 
         QString qdCmd; 
         int env = 0; 
         int rec = 0; 
         Categories Desc; 

         while (!params.isNull()) 
         { 
          QDomElement ParamName = params.toElement(); 

          if (ParamName.tagName() == "nome") 
          { 
           qdCmd = ParamName.text(); 
           child = new QStandardItem((qdCmd)); 
           child->setEditable(false); 
           child->setDragEnabled(false); 
           item->appendRow(child); 
          } 
          else 
          if (ParamName.tagName() == "env") 
          { 
           env = ParamName.text().toInt(); 
          } 
          else 
          if (ParamName.tagName() == "rec") 
          { 
           rec = ParamName.text().toInt(); 
          } 
          else 
          if (ParamName.tagName() == "desc") 
          { 
           Desc.push_back(ParamName.text()); 
          } 

          params = params.nextSibling(); 
         } 

         datafields.insert(pair<QString,int>( qdCmd,  env )); 
         receFields.insert(pair<QString,int>( qdCmd,  rec )); 
         descriptions.insert(pair<QString, Categories>(qdCmd, Desc)); 
        } 
        cat= cat.nextSibling(); 
       } 
       model->setItem(r++,item); 
      } 
      } 
      n = n.nextSibling(); 
    } 

    file.close(); 

    return 0; 

在解析我已經裝配的菜單之間。畢竟,當用戶編輯XML文件並重新加載應用程序時,我已經設置了更新XML,我只需擦除樹並重新創建。你可以看到我也將一些數據傳遞給了一些結構,它們基本上是std :: vector和std :: map。上面的代碼是用Qt文檔中的例子編寫的,順便說一下,這些代碼非常體面。

碰巧寫了一個簡單的對話框讓用戶避免編輯XML。好的,對我來說,即使從用戶的角度來看,編輯XML也可能更容易也更簡單,但是可能的用戶更喜歡在對話框上編輯東西。這一切都OK。我可以將數據傳遞給應用程序。一點都不麻煩。

但我需要更新XML。基本上編輯將包括通過添加新節點或將子節點插入到下來更新節點。我如何更新節點?有什麼具體的方法來完成這一點?我的XML經驗很短,我通常編寫,更新,解析txt和二進制文件。

我想要做的事,如:

if(root.tagName() != "comandos") 
     return -3; 

    QDomNode n = root.firstChild(); 
    while(!n.isNull()) 
    { 
      QDomElement e = n.toElement(); 
      if(!e.isNull()) 
      { 
      if(e.tagName() == "categoria") 
      { 
       QDomNode cat = n.firstChild(); 
       while(!cat.isNull()) 
       { 

        QDomElement CatName = cat.toElement(); 

        if (CatName.tagName() == "nome") 
        { 
         QString s = CatName.text(); 

         if (s != qsCategory) 
         { 
          // we have not found the category 
          // add it here 

         } 
         else 
         { 
          // the category exists simply update 
         } 



        } 

        cat= cat.nextSibling(); 
       } 
      } 
      } 
      n = n.nextSibling(); 
    } 

看來,使用Qt DOM是解析和創建XML文件相當不錯,但缺少的工具更新。任何幫助將非常感激,即使是一個例子。

這裏這個其他線程,

Edit Value of a QDomElement?

我已經看過在互聯網上的例子都將更新一個XML文件看起來非常有用。看來,如果我抓住當前節點,我可以添加一個孩子,到目前爲止,我沒有弄清楚如何做到這一點。

感謝您的幫助,顯然對我的無知感到抱歉。

+1

它是什麼,你想比你提到的答案嗎? – Koying 2012-03-21 15:17:20

+0

嗨,我想更新節點。例如,用戶將鍵入類別,命令和其他數據,這需要在XML中進行更新。我沒有找到如何插入新的節點,但基於以前存在的。 – zlogdan 2012-03-21 15:47:53

回答

7

QDomElement newCategoriaTag = doc.createElement(QString("categoria")); 
QDomElement newNomeTag = doc.createElement(QString("nome")); 
QDomText newNomeText = doc.createTextNode(QString("Cupom fiscal 2")); 
newNomeTag.appendChild(newNomeText); 
newCategoriaTag.appendChild(newNomeTag); 
root.appendChild(newCategoriaTag); 

這將導致:

<comandos> 
     <categoria> 
       <nome>Cupom fiscal</nome> 
       <comando> 
         <nome>01 - Abrir Cupom Fiscal</nome> 
         <env>3</env> 
         <rec>4</rec> 
         <desc>CNPJ/CPF : </desc> 
         <desc>Nome : </desc> 
         <desc>Endereco: </desc> 
       </comando> 
     </categoria> 
     <categoria> 
       <nome>Cupom fiscal 2</nome> 
     </categoria> 
</comandos> 
+0

非常感謝,我想你已經給了我答案。 – zlogdan 2012-03-23 10:16:34