Modify node attributes in XML file while parsing

View: New views
4 Messages — Rating Filter:   Alert me  

Modify node attributes in XML file while parsing

by Abhishek Kane :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi Guys,

I got a bit idea about parsing XML file from online search. I need to modify node attributes in an XML file while I read it. I could read node attributes; but when I modify them using setAttribute, the local copy of that node gets changed.
Is there any way to directly modify the node attributes in XML file or shall I just create another XML file where I will create nodes as I go through the nodes in old XML file?

Thanks,
Abhishek

_______________________________________________
XML-SIG maillist  -  XML-SIG@...
http://mail.python.org/mailman/listinfo/xml-sig

Re: Modify node attributes in XML file while parsing

by Stefan Behnel-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Abhishek Kane wrote:
> I got a bit idea about parsing XML file from online search. I need to modify
> node attributes in an XML file while I read it. I could read node
> attributes; but when I modify them using setAttribute, the local copy of
> that node gets changed.
> Is there any way to directly modify the node attributes in XML file or shall
> I just create another XML file where I will create nodes as I go through the
> nodes in old XML file?

Could you explain a bit more about your intentions? What is the code doing?
I understand that the XML data is in a file that you parse, but where is
the data going afterwards? Do you use it in your program? Do you save it
back into a file?

Stefan
_______________________________________________
XML-SIG maillist  -  XML-SIG@...
http://mail.python.org/mailman/listinfo/xml-sig

Parent Message unknown Re: Modify node attributes in XML file while parsing

by Josh English :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Everything works, but you need to write this over data.xml. I don't
remember how to do this in minidom. I think writing to an output file
is the only way to do this:

o = open('data.xml')
o.write(xmldoc.toxml())
o.close()

On Wed, Sep 16, 2009 at 9:58 AM, Abhishek Kane <abhishek.kane@...> wrote:

> <?xml version='1.0'?>
> <main_tag>
>
> <service name='abc' version='1'>
>     <instance name='default' value='false'/>
> </service>
> <service name='xyz' version='2'>
>     <instance name='default' value='false'/>
> </service>
>
> </main_tag>
>
>
>  is how the XML file looks like. I want to modify the value of instance
> based on the service name.
>
> So if i search for abc service & modify instance value like follows :
>
>
> import sys, logging, traceback
> from xml.dom import minidom
>
> data_file = "/tmp/data.xml"
>
> def main():
>     try:
>         xmldoc = minidom.parse(data_file)
>     except IOError:
>         print "err"
>         sys.exit(1)
>
>     start = xmldoc.firstChild
>
>     for element in xmldoc.getElementsByTagName("service"):
>         service = element.getAttribute("name")
>         print service
>         if service == "abc":
>             for instance in element.childNodes:
>                 if instance.nodeType == 1:
>                     print instance.getAttribute("value")
>                     instance.setAttribute("value", "true")
>                     print instance.getAttribute("value")
>
> if __name__ == "__main__":
>     logging.basicConfig(filename=log_file,level=logging.DEBUG)
>     main()
>
> The first print gives false & later one gives true. But the data.xml remains
> unchanged. How can I modify the node in data.xml?
>
> Thanks,
> Abhishek
>
> On Wed, Sep 16, 2009 at 9:47 PM, Josh English <joshua.r.english@...>
> wrote:
>>
>> If you are just searching for XML nodes, you are searching. If you are
>> interpreting them into something new, you are parsing.
>>
>> If you want to change an attribute, parse the XML file and make changes
>> there.
>>
>> Either that, or read the node attribute that you are given, make the
>> changes you need, but don't bother with writing a new XML file.
>>
>> Perhaps a sample of what you are trying to do would help up see the
>> solution.
>>
>> On 9/16/09, Abhishek Kane <abhishek.kane@...> wrote:
>> > Hi Guys,
>> >
>> > I got a bit idea about parsing XML file from online search. I need to
>> > modify
>> > node attributes in an XML file while I read it. I could read node
>> > attributes; but when I modify them using setAttribute, the local copy of
>> > that node gets changed.
>> > Is there any way to directly modify the node attributes in XML file or
>> > shall
>> > I just create another XML file where I will create nodes as I go through
>> > the
>> > nodes in old XML file?
>> >
>> > Thanks,
>> > Abhishek
>> >
>>
>>
>> --
>> Josh English
>> Joshua.R.English@...
>> http://joshenglish.livejournal.com
>
>
>
> --
> No defeat is final; until u stop fighting.
> - AGK
>
>



--
Josh English
Joshua.R.English@...
http://joshenglish.livejournal.com
_______________________________________________
XML-SIG maillist  -  XML-SIG@...
http://mail.python.org/mailman/listinfo/xml-sig

Parent Message unknown Re: Modify node attributes in XML file while parsing

by Abhishek Kane :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

<?xml version='1.0'?>
<main_tag>

<service name='abc' version='1'>
    <instance name='default' value='false'/>
</service>
<service name='xyz' version='2'>
    <instance name='default' value='false'/>
</service>

</main_tag>


 is how the XML file looks like. I want to modify the value of instance based on the service name.

So if i search for abc service & modify instance value like follows :


import sys, logging, traceback
from xml.dom import minidom

data_file = "/tmp/data.xml"

def main():
    try:
        xmldoc = minidom.parse(data_file)
    except IOError:
        print "err"
        sys.exit(1)

    start = xmldoc.firstChild

    for element in xmldoc.getElementsByTagName("service"):
        service = element.getAttribute("name")
        print service
        if service == "abc":
            for instance in element.childNodes:
                if instance.nodeType == 1:
                    print instance.getAttribute("value")
                    instance.setAttribute("value", "true")
                    print instance.getAttribute("value")

if __name__ == "__main__":
    logging.basicConfig(filename=log_file,level=logging.DEBUG)
    main()

The first print gives false & later one gives true. But the data.xml remains unchanged. How can I modify the node in data.xml?

Thanks,
Abhishek

On Wed, Sep 16, 2009 at 9:47 PM, Josh English <joshua.r.english@...> wrote:
If you are just searching for XML nodes, you are searching. If you are
interpreting them into something new, you are parsing.

If you want to change an attribute, parse the XML file and make changes there.

Either that, or read the node attribute that you are given, make the
changes you need, but don't bother with writing a new XML file.

Perhaps a sample of what you are trying to do would help up see the solution.

On 9/16/09, Abhishek Kane <abhishek.kane@...> wrote:
> Hi Guys,
>
> I got a bit idea about parsing XML file from online search. I need to modify
> node attributes in an XML file while I read it. I could read node
> attributes; but when I modify them using setAttribute, the local copy of
> that node gets changed.
> Is there any way to directly modify the node attributes in XML file or shall
> I just create another XML file where I will create nodes as I go through the
> nodes in old XML file?
>
> Thanks,
> Abhishek
>


--
Josh English
Joshua.R.English@...
http://joshenglish.livejournal.com



--
No defeat is final; until u stop fighting.
- AGK


_______________________________________________
XML-SIG maillist  -  XML-SIG@...
http://mail.python.org/mailman/listinfo/xml-sig