使用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>
有什么想法吗?
答案 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>