Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Writing Subchild with DOM
Forum Update on Monday, May 27th 2025

Writing Subchild with DOM

Scheduled Pinned Locked Moved Solved General and Desktop
parsexml parsing
12 Posts 2 Posters 3.6k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    Aashu10
    wrote on last edited by Aashu10
    #1

    I already have an XML file, I need to write under a Header, Below i have show a my XML file.

    <MAIN_HEADER>
      
      <HEADER1>
      //it's child
      </HEADER1>
    
      <HEADER2>
      //it's child>
      </HEADER2>
    
      <HEADER3>
      //EMPTY
      </HEADER3>
      
      <HEADER4>
      //it's child
      </HEADER4>
    
    </MAIN_HEADER>
      
    

    I need to write child and subchild inside HEADER3 . Below is my code.

    QFile file(output);
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            qDebug()<<"file doesnt exists";
        }
        QDomDocument domDocument;
        if( !domDocument.setContent( &file ) )
        {
            qDebug()<<"Error";
    
            return;
        }
    
        QDomElement topElement = domDocument.documentElement();
        QDomNode domNode = topElement.firstChild();
        while(!domNode.isNull())
        {
                        QDomElement domElement = domNode.toElement();
                        if(!domElement.isNull())
                        {
    
            if(domElement.tagName() == "HEADER3")
            {
                for(int i=0; i<List.count();i++)
                {
                    QDomElement node = domDocument.createElement("CHILD");
                    node.setAttribute("Name", List[i].Filename);
                    node.setAttribute("Value", List[i].value);
                    domElement.appendChild(node);
                    if(List[i].subChild.size() != 0)
                    {
                        QDomElement subNode =   domDocument.createElement("SubChild");
                        subNode.setAttribute("Name", List[i].SubChild);
                        node.appendChild(subNode);
                    }
                }
            }
    
    
                    }
    domNode = domNode.nextSibling();
                }
        file.close();
    
        QFile outfile( output);
        if( !outfile.open( QIODevice::WriteOnly | QIODevice::Text ) )
        {
            qDebug()<<"Error";
        }
    
        QTextStream stream1( &outfile );
        stream1 << dom.toString();
        outfile.close();
    

    This code gets stuck inside while loop, I'm not so sure about the hierarchy in this code. I just want to write the contents in <HEADER3>

    JohanSoloJ 1 Reply Last reply
    0
    • A Aashu10

      I already have an XML file, I need to write under a Header, Below i have show a my XML file.

      <MAIN_HEADER>
        
        <HEADER1>
        //it's child
        </HEADER1>
      
        <HEADER2>
        //it's child>
        </HEADER2>
      
        <HEADER3>
        //EMPTY
        </HEADER3>
        
        <HEADER4>
        //it's child
        </HEADER4>
      
      </MAIN_HEADER>
        
      

      I need to write child and subchild inside HEADER3 . Below is my code.

      QFile file(output);
          if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
          {
              qDebug()<<"file doesnt exists";
          }
          QDomDocument domDocument;
          if( !domDocument.setContent( &file ) )
          {
              qDebug()<<"Error";
      
              return;
          }
      
          QDomElement topElement = domDocument.documentElement();
          QDomNode domNode = topElement.firstChild();
          while(!domNode.isNull())
          {
                          QDomElement domElement = domNode.toElement();
                          if(!domElement.isNull())
                          {
      
              if(domElement.tagName() == "HEADER3")
              {
                  for(int i=0; i<List.count();i++)
                  {
                      QDomElement node = domDocument.createElement("CHILD");
                      node.setAttribute("Name", List[i].Filename);
                      node.setAttribute("Value", List[i].value);
                      domElement.appendChild(node);
                      if(List[i].subChild.size() != 0)
                      {
                          QDomElement subNode =   domDocument.createElement("SubChild");
                          subNode.setAttribute("Name", List[i].SubChild);
                          node.appendChild(subNode);
                      }
                  }
              }
      
      
                      }
      domNode = domNode.nextSibling();
                  }
          file.close();
      
          QFile outfile( output);
          if( !outfile.open( QIODevice::WriteOnly | QIODevice::Text ) )
          {
              qDebug()<<"Error";
          }
      
          QTextStream stream1( &outfile );
          stream1 << dom.toString();
          outfile.close();
      

      This code gets stuck inside while loop, I'm not so sure about the hierarchy in this code. I just want to write the contents in <HEADER3>

      JohanSoloJ Offline
      JohanSoloJ Offline
      JohanSolo
      wrote on last edited by
      #2

      @Aashu10 said:

      My code get's stuck when i compile it. I am very new to DOM Parser.

      Please elaborate what you mean? Getting stuck when compiling? What is the error?

      `They did not know it was impossible, so they did it.'
      -- Mark Twain

      1 Reply Last reply
      1
      • A Offline
        A Offline
        Aashu10
        wrote on last edited by
        #3

        No error, It's just stuck, When i debuged it. I found it's stuck in the while loop.

        JohanSoloJ 1 Reply Last reply
        0
        • A Aashu10

          No error, It's just stuck, When i debuged it. I found it's stuck in the while loop.

          JohanSoloJ Offline
          JohanSoloJ Offline
          JohanSolo
          wrote on last edited by
          #4

          @Aashu10 said:

          No error, It's just stuck, When i debuged it. I found it's stuck in the while loop.

          OK, so the code compiles.

          I think you never go to the next node... it just reads forever and ever the first node of you document.

          `They did not know it was impossible, so they did it.'
          -- Mark Twain

          1 Reply Last reply
          1
          • A Offline
            A Offline
            Aashu10
            wrote on last edited by
            #5

            Any suggestion how to bypass this?

            1 Reply Last reply
            0
            • JohanSoloJ Offline
              JohanSoloJ Offline
              JohanSolo
              wrote on last edited by
              #6

              Well, at some point you must read you document, i.e. go from one node to the other. At the end of the loop you should do something like domNode = domeNode.nextSibling(). If you don't do so, you're endlessly reading the first node of your document, as I've told you before.

              `They did not know it was impossible, so they did it.'
              -- Mark Twain

              1 Reply Last reply
              1
              • A Offline
                A Offline
                Aashu10
                wrote on last edited by Aashu10
                #7

                Ah! Thank you! @JohanSolo Now it goes through the loop properly, but the contents of the header is still empty. I just debugged, found out it never goes into

                if(domElement.text() == "HEADER3")
                

                I am not sure about hierarchy in the code. but the hierarchy in my XML file is as shown in this XML file

                @JohanSolo I have edited the code accordingly

                JohanSoloJ 1 Reply Last reply
                0
                • A Aashu10

                  Ah! Thank you! @JohanSolo Now it goes through the loop properly, but the contents of the header is still empty. I just debugged, found out it never goes into

                  if(domElement.text() == "HEADER3")
                  

                  I am not sure about hierarchy in the code. but the hierarchy in my XML file is as shown in this XML file

                  @JohanSolo I have edited the code accordingly

                  JohanSoloJ Offline
                  JohanSoloJ Offline
                  JohanSolo
                  wrote on last edited by JohanSolo
                  #8

                  @Aashu10 said:

                  if(domElement.text() == "HEADER3")
                  

                  I am not sure about hierarchy in the code. but the hierarchy in my XML file is as shown in this XML file

                  Use tagName(), text() returns the text contained in a tag.

                  `They did not know it was impossible, so they did it.'
                  -- Mark Twain

                  1 Reply Last reply
                  1
                  • A Offline
                    A Offline
                    Aashu10
                    wrote on last edited by Aashu10
                    #9

                    Yes! @JohanSolo Now it goes inside the loop, but does not write the contents inside HEADER3. This time i have no idea why. I have updated the code. Please do take a look.

                    1 Reply Last reply
                    0
                    • JohanSoloJ Offline
                      JohanSoloJ Offline
                      JohanSolo
                      wrote on last edited by JohanSolo
                      #10

                      I don't see any obvious mistake. Note that I've never used QDomDocument to write a file. It's such a waste of memory according to me...

                      Edit: you should get a look at the returned value of appendChild to check that everything went fine.

                      `They did not know it was impossible, so they did it.'
                      -- Mark Twain

                      1 Reply Last reply
                      1
                      • A Offline
                        A Offline
                        Aashu10
                        wrote on last edited by
                        #11

                        Thanks for replying, How do i check the return value of that. Sorry not so proficient with DomDocument.

                        JohanSoloJ 1 Reply Last reply
                        0
                        • A Aashu10

                          Thanks for replying, How do i check the return value of that. Sorry not so proficient with DomDocument.

                          JohanSoloJ Offline
                          JohanSoloJ Offline
                          JohanSolo
                          wrote on last edited by
                          #12

                          @Aashu10 said:

                          Thanks for replying, How do i check the return value of that. Sorry not so proficient with DomDocument.

                          Have a look at the doc

                          `They did not know it was impossible, so they did it.'
                          -- Mark Twain

                          1 Reply Last reply
                          1

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved