2016-11-17 5 views
1

У меня около 1000 xml файлов, а некоторые отсутствуют элемент. Я сделал сценарий для поиска через xml и распечатал элемент. Я хотел добавить возможность добавить элемент, если он там отсутствует, но не увенчался успехом.Python XML добавить элемент в файл

Как вы можете видеть ниже, DVT3 не существует, и его необходимо добавить.

Мой код

XMLParser = etree.XMLParser(remove_blank_text=True) 
for f in os.listdir(directory): 
    if f.endswith(".xml"): 

     xmlfile = directory + '/' + f 


     tree = etree.parse(xmlfile, parser=XMLParser) 
     root = tree.getroot() 

     hardwareRevisionNode = root.find(".//hardwareRevision") 

     try: 
      print f + ' : ' + hardwareRevisionNode.text 
     except Exception as e: 
      print str(e) 
      print xmlfile 
      #Wearable = root.find(".//Wearable") 
      ChildNode = etree.Element(".//Wearable") 
      ChildNode.text = "DVT2" 
      ChildNode.append(ChildNode) 
      tree.write(xmlfile, pretty_print=True) 

XML File

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> 
<Speech> 
    <Results> 
    <breakpoint name="ASR_START_RECOGNITION" elapsedTime="00:00:00.000" /> 
    </Results> 
    <Meta> 
    <Dialog> 
     <sessionUUID>7c9b1e3a-b22f-4793-818f-72bc6e7b84a9</sessionUUID> 
    </Dialog> 
    <ASR> 
     <engine> 
     <name>Rockhopper</name> 
     <version>1.0.0.61</version> 
     </engine> 
     <wrapper> 
     <name>RockhopperAsrEngine</name> 
     <version>1.8.2</version> 
     </wrapper> 
     <wrapper> 
     <name>Core</name> 
     <version>1.8.2</version> 
     </wrapper> 
     <resource> 
     <name>Language Model</name> 
     <version>1.4.4</version> 
     </resource> 
    </ASR> 
    <Application> 
     <name>FightClub</name> 
     <version>0.1.550</version> 
     <commit>8f7a411</commit> 
     <buildDate>2016-03-09T18:16Z</buildDate> 
     <branch>HEAD</branch> 
    </Application> 
    <Wearable> 
     <firmware>1.0.183 - FCB1APP000-1611W0183</firmware> 
    </Wearable> 
    </Meta> 
</Speech> 

XML файл I Want

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> 
<Speech> 
    <Results> 
    <breakpoint name="ASR_START_RECOGNITION" elapsedTime="00:00:00.000" /> 
    </Results> 
    <Meta> 
    <Dialog> 
     <sessionUUID>7c9b1e3a-b22f-4793-818f-72bc6e7b84a9</sessionUUID> 
    </Dialog> 
    <ASR> 
     <engine> 
     <name>Rockhopper</name> 
     <version>1.0.0.61</version> 
     </engine> 
     <wrapper> 
     <name>RockhopperAsrEngine</name> 
     <version>1.8.2</version> 
     </wrapper> 
     <wrapper> 
     <name>Core</name> 
     <version>1.8.2</version> 
     </wrapper> 
     <resource> 
     <name>Language Model</name> 
     <version>1.4.4</version> 
     </resource> 
    </ASR> 
    <Application> 
     <name>FightClub</name> 
     <version>0.1.550</version> 
     <commit>8f7a411</commit> 
     <buildDate>2016-03-09T18:16Z</buildDate> 
     <branch>HEAD</branch> 
    </Application> 
    <Wearable> 
     <firmware>1.0.183 - FCB1APP000-1611W0183</firmware> 
     <hardwareRevision>DVT3</hardwareRevision> 
    </Wearable> 
    </Meta> 
</Speech> 

ответ

1

Вы можете попробовать xmltodict.

import xmltodict as x 

with open(myfile) as f: 

    xmlDictionary=x.parse(f.read(),'utf-8') 
    xmlDictionary['Speech']['Meta']['Wearable'].update({"hardwareRevision": "DVT3"}) 

    output = x.unparse(xmlDictionary) 

    with open(outfile,'w') as out: 
     out.write(output) 

Сделать это работать параллельно, если вы хотите, и если хранение является проблема просто заменить содержимое файлов (или удалить старые мгновенный после новых сделаны).