Writing Subchild with DOM



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



  • @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?



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



  • @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.



  • Any suggestion how to bypass this?



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



  • 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



  • @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.



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



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



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



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


Log in to reply
 

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