2012-03-21 12 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やバイナリファイルの書き込み、更新、解析を行います。

私のような何かをしたい:Qtのドムを使用してXMLファイルを解析し、作成するためのかなりまともですが、それは更新のためのツールを欠いているようです

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

。どのような助けも非常に高く評価されます。私は、XMLファイルを更新してしまう例については、インターネット上で見てきた

Edit Value of a QDomElement?

ここで、この他のスレッドでは、便利になります。現在のノードを捕まえれば、子供を追加することができます。これまでのところ、私はそのようにする方法を理解していませんでした。

助けてくれてありがとうございました。私の無知を申し訳ありません。

+1

それはあなたが言及答えよりも多くを望んでいることは何ですか? – Koying

+0

こんにちは、ノードを更新したいと思います。たとえば、ユーザーはカテゴリ、コマンド、およびその他のデータを入力しますが、これはXMLで更新する必要があります。私はどのように新しいノードを挿入するかを知りませんでしたが、既存のものに基づいていました。 – zlogdan

答えて

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

関連する問題