【问题标题】:Merge xml files with nested elements with attributes and values合并带有属性和值的嵌套元素的 xml 文件
【发布时间】:2019-10-22 09:17:24
【问题描述】:

使用this 解决方案我遇到了问题。

合并 xml 文件。

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

并且必须删除重复项。

在此示例中,带有 FileB.txt 的条目是重复的。

文件A.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>

文件B.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>

预期结果.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>

有什么想法吗?

【问题讨论】:

    标签: python xml elementtree


    【解决方案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>
    

    【讨论】:

    • 这不会删除重复项
    • 请定义“重复”
    • 带有 FileB.txt 的条目在源文件中是重复的。
    • 代码应该查看哪些元素:SrcFile 或 Destfile 以检查重复项?
    • SrcFile 是检测重复的标识符
    猜你喜欢
    • 2020-04-08
    • 2013-01-30
    • 2012-09-07
    • 2020-05-14
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多