合并具有属性和值的嵌套元素的xml文件

时间:2019-10-22 09:17:24

标签: python xml elementtree

使用this解决方案时,我遇到了一个问题。

合并xml文件。

我的问题是,我还必须考虑这些值。

并且必须删除重复项。

在此示例中,FileB.txt的条目被重复。

FileA.xml

<update>
  <Files>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileA.txt</SrcFile>
      <DestFile>\FolderB\FileA.txt</DestFile>
    </CopyFile>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileB.txt</SrcFile>
      <DestFile>\FolderB\FileB.txt</DestFile>
    </CopyFile>
  </Files>
</update>

FileB.xml

<update>
  <Files>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileB.txt</SrcFile>
      <DestFile>\FolderB\FileB.txt</DestFile>
    </CopyFile>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileC.txt</SrcFile>
      <DestFile>\FolderB\FileC.txt</DestFile>
    </CopyFile>
  </Files>
</update>

预期的Result.xml

<update>
  <Files>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileA.txt</SrcFile>
      <DestFile>\FolderB\FileA.txt</DestFile>
    </CopyFile>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileB.txt</SrcFile>
      <DestFile>\FolderB\FileB.txt</DestFile>
    </CopyFile>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileC.txt</SrcFile>
      <DestFile>\FolderB\FileC.txt</DestFile>
    </CopyFile>
  </Files>
</update>

如果我将映射更改为

    mapping = {(el.tag, hashabledict(el.attrib), el.text): el for el in one}

缺少父元素CopyFile。

我的结果将是

<update>
  <Files>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileA.txt</SrcFile>
      <DestFile>\FolderB\FileA.txt</DestFile>
    </CopyFile>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileB.txt</SrcFile>
      <DestFile>\FolderB\FileB.txt</DestFile>
      <SrcFile>\FolderA\FileC.txt</SrcFile>
      <DestFile>\FolderB\FileC.txt</DestFile>
    </CopyFile>
  </Files>
</update>

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

下面

import xml.etree.ElementTree as ET

xml1 = '''<update>
  <Files>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileA.txt</SrcFile>
      <DestFile>\FolderB\FileA.txt</DestFile>
    </CopyFile>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileB.txt</SrcFile>
      <DestFile>\FolderB\FileB.txt</DestFile>
    </CopyFile>
  </Files>
</update>'''
xml2 = '''<update>
  <Files>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileC.txt</SrcFile>
      <DestFile>\FolderB\FileC.txt</DestFile>
    </CopyFile>
  </Files>
</update>'''


root1 = ET.fromstring(xml1)
root2 = ET.fromstring(xml2)
copy_files = [e for e in root1.findall('.//CopyFile')]
src_files = set([e.find('./SrcFile').text for e in copy_files])
copy_files.extend([e for e in root2.findall('.//CopyFile') if e.find('./SrcFile').text not in src_files])

merged_root = ET.Element('update')
files = ET.SubElement(merged_root, 'files')
files.extend(copy_files)

ET.dump(merged_root)

输出

<update><files><CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileA.txt</SrcFile>
      <DestFile>\FolderB\FileA.txt</DestFile>
    </CopyFile>
    <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileB.txt</SrcFile>
      <DestFile>\FolderB\FileB.txt</DestFile>
    </CopyFile>
  <CopyFile overwrite="FALSE">
      <SrcFile>\FolderA\FileC.txt</SrcFile>
      <DestFile>\FolderB\FileC.txt</DestFile>
    </CopyFile>
  </files></update>