2012-03-21 13 views
6

का उपयोग कर एक एक्सएमएल फ़ाइल अपडेट करना मेरे पास एक ऐसा एप्लिकेशन है जो एक पेड़ क्यूटी घटक पर आधारित एक बाएं मेनू बनाता है। इसे लोड करने के लिए मुझे एक 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; 

पार्सिंग के बीच में मैं पहले से ही मेनू को असेंबली करता हूं। आखिरकार, मेरे पास एक्सएमएल अपडेट करने के लिए पहले से ही सेट है जब उपयोगकर्ता एक्सएमएल फाइल को संपादित करता है और एप्लिकेशन पर पुनः लोड करता है, तो मैं बस पेड़ मिटा देता हूं और इसे दोबारा बना देता हूं। आप देख सकते हैं कि मैं कुछ संरचनाओं पर कुछ डेटा भी पास करता हूं, वे मूल रूप से std :: vector और std :: map हैं। उपरोक्त यह कोड क्यूटी दस्तावेज के उदाहरणों के साथ लिखा गया था, जो कि रास्ते से काफी सभ्य हैं।

ऐसा होता है कि मैंने एक्सएमएल को संपादित करने से बचने के लिए एक सरल संवाद लिखा था। ठीक है, मेरे लिए उपयोगकर्ता परिप्रेक्ष्य से एक्सएमएल को संपादित करना आसान और आसान हो सकता है, लेकिन संभावित उपयोगकर्ता संवाद पर चीजों को संपादित करना पसंद करेंगे। यह सब ठीक है। मैं डेटा को एप्लिकेशन को पास कर सकता हूं। कोई परेशानी नहीं।

लेकिन मुझे एक्सएमएल अपडेट करने की आवश्यकता है। मूल रूप से एक संपादन में नोड को अद्यतन करने या एक नया नोड डालने से नोड को अद्यतन करने में शामिल होगा। मैं नोड कैसे अपडेट करूं? क्या इसे पूरा करने का कोई विशिष्ट तरीका है? एक्सएमएल के साथ मेरे अनुभव कम हैं, मैं आमतौर पर लिखता हूं, अद्यतन करता हूं, 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(); 
    } 

ऐसा लगता है कि क्यूटी डोम का उपयोग कर पार्स करने और बनाने एक्सएमएल फाइल के लिए काफी सभ्य है, लेकिन यह अद्यतन के लिए उपकरणों का अभाव है। किसी भी मदद की सराहना की जाएगी, यहां तक ​​कि एक उदाहरण भी।

यह अन्य धागा यहाँ, उपयोगी लग रहा है

Edit Value of a QDomElement?

मुझे लगता है कि एक एक्सएमएल फ़ाइल को अद्यतन करेगा उदाहरण के लिए इंटरनेट पर ध्यान दिया है। ऐसा लगता है कि अगर मैं वर्तमान नोड को पकड़ता हूं तो मैं इसमें एक बच्चा जोड़ सकता हूं, अब तक मुझे यह नहीं पता था कि ऐसा कैसे किया जाए।

मेरी अज्ञानता के लिए मदद और स्पष्ट रूप से खेद के लिए धन्यवाद।

+1

यह क्या है कि आप इस सवाल का जवाब आप का उल्लेख की तुलना में अधिक चाहते हैं? – Koying

+0

हाय, मैं नोड को अपडेट करना चाहता हूं। उदाहरण के लिए, उपयोगकर्ता श्रेणी, कमांड और अन्य डेटा टाइप करेगा, और इसे एक्सएमएल में अपडेट करने की आवश्यकता है। मुझे पता नहीं था कि एक नया नोड कैसे डाला जाए लेकिन पहले अस्तित्व के आधार पर। – 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