简体   繁体   中英

Python: Modifying an XML File

I'm stuck, I've written a code that looks for specific index in xml file. But when find that Index won't create me a new xml file with just that Index in and constant parameters. it returns an error:

...rba_u_xml.py", line 29, in <module>
ObjectDictionary.remove(Variable)
File "C:\Python27\lib\xml\etree\ElementTree.py", line 337, in remove
self._children.remove(element)
ValueError: list.remove(x): x not in list

this is my code:

import xml.etree.ElementTree as ET
tree = ET.parse('master.xml')
root = tree.getroot()

s = input('Insert a number of index and add quotes(") befor and after: ')
i = int(s, 16)

for MagicNumber in root.findall('MagicNumber'):   #constant parameters
    print MagicNumber.tag,':', MagicNumber.text
    print('\n')
for FileInfo in root.find('FileInfo'):
    print FileInfo.tag,':', FileInfo.text
print''
for DeviceInfo in root.find('DeviceInfo'):
    print DeviceInfo.tag,':', DeviceInfo.text
print''
for DummyUsage in root.find('DummyUsage'):
    print DummyUsage.tag,':', DummyUsage.text
print''
for ObjectDictionary in root.find('ObjectDictionary'):
    name=ObjectDictionary.get('name')
    print ObjectDictionary.tag,':', ObjectDictionary.text, name
    print''                                                       #constant parameters

    for Variable in ObjectDictionary.iter('Variable'):          #searching for Variables in index
        if Variable.find('./Index').text == str(i):
            print 'Variable name: ', Variable.attrib['name']
        elif Variable.find('./Index').text != str(i):
            ObjectDictionary.remove(Variable)

    for Record in ObjectDictionary.iter('Record'):             #searching for Records in index
        if Record.find('./Index').text == str(i):
            print 'Record name: ', Record.attrib['name']
        elif Record.find('./Index').text != str(i):
            ObjectDictionary.remove(Record)

    for Array in ObjectDictionary.iter('Array'):               #searching for Arrays in index
        if Array.find('./Index').text == str(i):
            print 'Array name: ', Array.attrib['name']
        elif Array.find('./Index').text != str(i):
            ObjectDictionary.remove(Array)


tree.write('output.xml')            #That would be amended to create a new xml file

Thanks for your help! I hope you understand(in the other case ask) because I use google translator a lot :)

I solved it! :D Insted of xml.etree.ElementTree modul I use xml module and insted of ObjectDictionary.remove(Variable) I use Variable.clear()

I use lxml module

from lxml import etree as ET
tree = ET.parse('master.xml')
root = tree.getroot()

-

s = input('Insert a number of index and add quotes(") befor and after: ')
i = int(s, 16)

for MagicNumber in root.findall('MagicNumber'):   #constant parameters
    print MagicNumber.tag,':', MagicNumber.text
    print('\n')
for FileInfo in root.find('FileInfo'):
    print FileInfo.tag,':', FileInfo.text
print''
for DeviceInfo in root.find('DeviceInfo'):
    print DeviceInfo.tag,':', DeviceInfo.text
print''
for DummyUsage in root.find('DummyUsage'):
    print DummyUsage.tag,':', DummyUsage.text
print''
for ObjectDictionary in root.find('ObjectDictionary'):
    name=ObjectDictionary.get('name')
    print ObjectDictionary.tag,':', ObjectDictionary.text, name
    print''                                                       #constant parameters

    for Variable in ObjectDictionary.iter('Variable'):          #searching for Variables in index
        if Variable.find('./Index').text == str(i):
            print 'Variable name: ', Variable.attrib['name']
        elif Variable.find('./Index').text != str(i):
            Variable.clear()                         #insted of ObjectDictionary.remove(Variable)

    for Record in ObjectDictionary.iter('Record'):             #searching for Records in index
        if Record.find('./Index').text == str(i):
            print 'Record name: ', Record.attrib['name']
        elif Record.find('./Index').text != str(i):
            Record.clear()                             #insted of ObjectDictionary.remove(Record)

    for Array in ObjectDictionary.iter('Array'):               #searching for Arrays in index
        if Array.find('./Index').text == str(i):
            print 'Array name: ', Array.attrib['name']
        elif Array.find('./Index').text != str(i):
            Array.clear()                               #insted of ObjectDictionary.remove(Array)


tree.write('output.xml')            #create a new xml file

In new xml file is now left just tags of variables,records and arrays.

<Group name="OptionalObjects"> <Array/><Array/><Variable/><Variable/><Variable/><Record/><Record/><Record/><Record/><Record/><Record/><Record/><Record/></Group>

Have anybody any idea how to solved out this (I hope) last problem?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM