Python 将xml文件与具有属性和值的嵌套元素合并
对于解决方案,我有一个问题 合并xml文件 我的问题是,我也必须考虑这些价值。 必须删除重复项Python 将xml文件与具有属性和值的嵌套元素合并,python,xml,elementtree,Python,Xml,Elementtree,对于解决方案,我有一个问题 合并xml文件 我的问题是,我也必须考虑这些价值。 必须删除重复项 在此示例中,带有FileB.txt的条目是重复的 FileA.xml <update> <Files> <CopyFile overwrite="FALSE"> <SrcFile>\FolderA\FileA.txt</SrcFile> <DestFile>\FolderB\FileA.txt&
在此示例中,带有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>
缺少父元素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>
\FolderA\FileA.txt
\FolderB\FileA.txt
\FolderA\FileB.txt
\FolderB\FileB.txt
\FolderA\FileC.txt
\FolderB\FileC.txt
有什么想法吗?如下
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)
将xml.etree.ElementTree作为ET导入
xml1=''
\FolderA\FileA.txt
\FolderB\FileA.txt
\FolderA\FileB.txt
\FolderB\FileB.txt
'''
xml2=''
\FolderA\FileC.txt
\FolderB\FileC.txt
'''
root1=ET.fromstring(xml1)
root2=ET.fromstring(xml2)
copy_files=[e代表root1.findall('.//CopyFile')中的e]
src_files=set([e.find('./SrcFile')。复制_文件中e的文本])
copy_files.extend([e代表root2.findall('.//CopyFile')中的e,如果e.find('../SrcFile')。文本不在src_文件中])
合并的根=ET.Element('update')
files=ET.SubElement(合并根目录“files”)
扩展(复制文件)
ET.dump(合并根目录)
输出
<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>
\FolderA\FileA.txt
\FolderB\FileA.txt
\FolderA\FileB.txt
\FolderB\FileB.txt
\FolderA\FileC.txt
\FolderB\FileC.txt
这不会删除duplicate请定义“duplicate”带有FileB.txt的条目在源文件中是重复的。代码应该查看的元素是什么:SrcFile
或Destfile
以检查重复?SrcFile是检测重复的标识符
<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>