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

Merge xml files with nested elements with attributes and values

使用 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>

有什么想法吗?

低于

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>