Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将xml文件与具有属性和值的嵌套元素合并_Python_Xml_Elementtree - Fatal编程技术网

Python 将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&

对于解决方案,我有一个问题

合并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>
缺少父元素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>