Reading a xml file and parsing it



  • I am not that good with xml, but my basic xml file looks somthing like this.

    XML CODE:

    <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>
    

    what I want to do is, I need to find 2-3 tags, say for example NAME & SEX and store the attribute(John,Male) in another variable.

    until now, I have been able to make it read the xml file.

    void MainWindow::XMLParser()
    {
            QString path=MainWindow::getWorkingDirectory()+"\\0_Config\\";
            QString string;
            string = path + ui->ConfigFiles_combo->currentText();
            QXmlStreamReader xmlreader;
            QFile file(string);
            if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
            {
               QMessageBox::information(this,tr("info"),tr("Failed to open file"));
            }
            else
            {
                qDebug()<<"ok";
            }
    
    
            while(!xmlreader.atEnd())
               {
                   if(xmlreader.isStartElement())
                   {
                       if(xmlreader.name()== "NEOTUX_CFG")
                       {
                           xmlreader.readNext();
                       }
                       else  if(xmlreader.name() == "HEADER")
                       {
                         while(!xmlreader.atEnd())
                           {
                              if(xmlreader.isEndElement())
                               {
                                 if(xmlreader.name() == "TITLE")
                                  {
                                    xmlreader.readNext();
                                    break;
                                   }
                                   xmlreader.readNext();
                               }
                              else if(xmlreader.isCharacters())
                               {
                                  xmlreader.readNext();
                               }
                              else if(xmlreader.isStartElement())
                               {
                                 if(xmlreader.name() == "PLATFORM")
                                   {
                                     xmlreader.readNext();
                                   }
                                  else if(xmlreader.name() == "AUTHOR")
                                  {
                                   xmlreader.readNext();
                                  }
                                  else if(xmlreader.name() == "TEST_VARIANT")
                                  {
                                   QString name=xmlreader.readElementText(); // found
                                   qDebug()<< name;
                                  }
    
    
                              }
                               else
                               {
                                 xmlreader.readNext();
                               }
                           }
    
                   if(xmlreader.isEndElement())
                   {
                       if(xmlreader.name() == "HEADER")
                       {
                           break;
                       }
                       xmlreader.readNext();
                   }
                   else
                   {
                       xmlreader.readNext();
                   }
               }
    
            }
    
    
    }
            }
    

    how do I make it search for the exact tag and store it inside another variable?



  • Hi and welcome,
    You can use isStartElement() to read the start of the tag. name() to match exact name.
    writeStartElement to start write the tag header and writeTextElementto write a text element .



  • Hey!

    I do not want to write anything on the XML, I need to fetch the attribute of that tag so that I can use it for later. Can you please show me some example which is related to my case. because every where I see I get examples of XmlStreamRreader.



  • This post is deleted!


  • @Aashu10
    You can read this way.

    qxmlstreamreader *xmlreader;
    
    while(!xmlreader->atEnd())
       {
           if(xmlreader->isStartElement())
           {
               if(xmlreader->name()== "MAIN_HEADER")
               {
                   xmlreader->readnext();
               }
    		else  if(xmlreader->name() == "HEADER")
    		{
                 while(!xmlreader->atEnd())
                   {
                      if(xmlreader->isendelement())
                       {
                         if(xmlreader->name() == "HEADER")
                          {
                            xmlreader->readNext();
                            break;
                           }
                           xmlreader->readNext();
                       }
                      else if(xmlreader->isCharacters())
                       {
                          xmlreader->readnext();
                       }
                      else if(xmlreader->isStartElement())
                       {
                         if(xmlreader->name() == "TITLE")
                           {            
                             xmlreader->readNext();
                           }
                          else if(xmlreader->name() == "AUTHOR")
                          {
                           xmlreader->readNext();
                          }
                          else if(xmlreader->name() == "NAME")
    		           {
    		            qstring name=xmlReader->readElementText()) ;// found
    		           }
    		          .................
    		
                       else
                       {
                         xmlreader->readNext();
                       }
    			}
    	
           else if(xmlreader->isEndElement())
           {
               if(xmlreader->name() == "MAIN_HEADER")
               {
                   break;
               }
               xmlreader->readNext();
           }
           else
           {
               xmlreader->readnext();
           }
       }
    
    }		
    
    


  • So i do not have to consider the main tag? <MAIN_HEADER>



  • @Aashu10
    I have EDITed the previous post.



  • I am very new to Xmlstreamreader, Please bear with me
    I am getting a error as " C2039: 'readnext' : is not a member of 'QXmlStreamReader'



  • @Aashu10
    I edited the code in the text editor. So be careful with the spelling.

    xmlReader->readNext();
    


  • Ah there's sytax error, trying real hard to find it out. I'm getting:
    " error: C2181: illegal else without matching if"
    on line:
    else if(xmlreader.isEndElement()). any idea why?


  • Moderators

    Probably } before else if(xmlreader.isEndElement()) is missing



  • @Aashu10
    We cannot just say if the tag is read or not. it requires careful observations.
    Best way is to right the read tags back to .xml file to check if it really read or not .



  • @Ratzz

    Thanks a ton! i think i am near to solving the problem, i have edited the program. You can see what exactly i am doing. I choosing a xml file from a dropdown. and QT parse that XML file. Now when i choose an xml file. Whole program gets stuck.



  • @Aashu10
    I have written a test code which works fine for me . Its here .or from here .



  • Thanks alot! still can't figure out why does my gui hangs.
    Can you please tell me what does String holds in:
    "QString name=xmlreader.readElementText(); // found"

    I had a debug there to check, unfortunately my gui is hanging



  • Did you try the test code?
    QString name holds the name john
    Download this zip file. Build your project and browse for the XML.xml file to find the matched name .



  • Thanks for the help! this works too! But i think DOM is turning out to be simpler, i really appriciate your help. don't exactly know how to accept your answer on this forum.



  • @Aashu10
    There is nothing like "answer" for particular question . You can Upvote the answer(s) that helped you to solve the issue.
    Once your problem is solved please use the Topic Tools button to mark as Solved.
    Thank you!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.