Python XML将元素添加到文件中

时间:2016-11-17 18:02:00

标签: python xml lxml elementtree

我有大约1000个xml文件,有些缺少一个元素。我制作了一个脚本来搜索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>

我想要的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>
      <hardwareRevision>DVT3</hardwareRevision>
    </Wearable>
  </Meta>
</Speech>

1 个答案:

答案 0 :(得分: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)

如果需要,让它并行运行,如果存储是一个问题,只需替换文件的内容(或在新的文件后立即删除旧的文件)。