2016-11-17 7 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ファイル

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

私はあなたがxmltodictを試してみることができます

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

をしたいXMLファイル。

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) 

したい場合は、それは並列で実行してください、そしてストレージが懸念される場合は、単純にファイルの内容を置き換える(または新しいものが作られていますimmediatelly後に古いものを削除します)。

関連する問題