Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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数据从XML文件添加到现有XML文件_Python_Xml_Elementtree - Fatal编程技术网

Python 将XML数据从XML文件添加到现有XML文件

Python 将XML数据从XML文件添加到现有XML文件,python,xml,elementtree,Python,Xml,Elementtree,我对Python非常陌生,只读了下面的内容。但我认为这仍然超出了我的范围。我的技能是XML/XSL,而不是Python。我需要一点帮助来开始 概述:我需要将缺少的XML数据(addition.XML)添加到现有的XML文件(original.XML)中 XML文件(包含缺少的数据):(addition.XML) 俏皮话 1. 苏西 12 ue 25 女性的 上面的XML数据添加到此XML文件:(original.XML) foo> 酒吧 3. 板球 2. 泰勒 26 三菱 漂移 2013

我对Python非常陌生,只读了下面的内容。但我认为这仍然超出了我的范围。我的技能是XML/XSL,而不是Python。我需要一点帮助来开始

概述:我需要将缺少的XML数据(addition.XML)添加到现有的XML文件(original.XML)中

XML文件(包含缺少的数据):(addition.XML)


俏皮话
1.
苏西
12
ue
25
女性的
上面的XML数据添加到此XML文件:(original.XML)


foo>
酒吧
3.
板球
2.
泰勒
26
三菱
漂移
2013
我的预期输出应该是:-->新的(original.xml)


foo>
酒吧
3.
俏皮话
1.
苏西
12
板球
2.
泰勒
26
ue
25
女性的
三菱
漂移
2013
这里发生的情况是,原始的.xml文件中缺少addition.xml中的数据。如何将addition.xml中的数据添加到原始的.xml中,而不是创建一个新文件,覆盖它

我浏览了谷歌和stackoverflow。我知道我可以使用
ElementTree
,但我对如何创建这个结果有着最模糊的想法


非常感谢您的帮助

您的需求不允许通用合并程序(如您链接到的程序),但这里有一个可能适合您的程序

用法:./program.py original.xml addition.xml

#! /usr/bin/python2

import sys
from lxml import etree

result = etree.Element('root')
parser = etree.XMLParser(remove_blank_text=True)

# Add each file to the tree
for xmlfile in sys.argv[1:]:
  with open(xmlfile) as xmlfile:
    btree = etree.parse(xmlfile, parser)
  # Ensure that the resulting tree has the right root
  result.tag = btree.getroot().tag
  # Consider each 2nd-level item
  for bchild in btree.xpath("/*/*"):
    tags = result.xpath("./%s"%bchild.tag)
    if len(tags) == 0:
      # Add <dog-list>, for example
      #print "adding %s to %s"%(bchild.tag, result.tag)
      result.append(bchild)
    else:
      for bgrandchild in bchild:
        # add <dog>, for example
        #print "adding %s to %s"%(bgrandchild.tag, tags[0].tag)
        tags[0].append(bgrandchild)

with open("output.xml", "w") as output:
  output.write(etree.tostring(result, pretty_print = True))
#/usr/bin/python2
导入系统
从lxml导入etree
结果=etree.Element('根')
parser=etree.XMLParser(删除\u blank\u text=True)
#将每个文件添加到树中
对于sys.argv[1:]中的xmlfile:
将open(xmlfile)作为xmlfile:
btree=etree.parse(xmlfile,parser)
#确保生成的树具有正确的根
result.tag=btree.getroot().tag
考虑每一个第二级项目
对于btree.xpath(“/*/*”)中的bchild:
tags=result.xpath(“./%s”%bchild.tag)
如果len(标签)==0:
#例如,添加
#打印“将%s添加到%s%”(bchild.tag,result.tag)
result.append(bchild)
其他:
对于bgrandchild中的bgrandchild:
#例如,添加
#打印“将%s添加到%s%”(bgrandchild.tag,tags[0].tag)
标记[0]。追加(bgrandchild)
以open(“output.xml”、“w”)作为输出:
output.write(etree.tostring(结果,pretty\u print=True))

您的xml数据无效:查看不匹配的开始和结束标记。已修复。对不起,我把它打出来了,遗漏了一个结束标记
元素的顺序是否相关?
必须在
之后出现吗?是的,我终于找到了一些非常接近的东西。但它并没有打断新行,而是将行并排聚集,并且不会覆盖文件或创建新文件。它只是在终端上打印。
<profile>
    <cat-list>
        <cat>
            <name>foo></name>
        </cat>
        <cat>
            <name>bar</name>
            <age>3</age>
        </cat>
    </cat-list>
    <bird-list>
        <bird>
            <name>cricket</name>
            <age>2</age>
        </bird>
    </bird-list>
    <people-list>
        <person>
            <name>tyler</name>
            <age>26</age>
        </person>
    </people-list>
    <car-list>
        <car>
            <make>mitsubishi</make>
            <model>evo x</model>
            <year>2013</year>
        </car>
    </car-list>
</profile>
<profile>
    <cat-list>
        <cat>
            <name>foo></name>
        </cat>
        <cat>
            <name>bar</name>
            <age>3</age>
        </cat>
    </cat-list>
    <dog-list>
        <dog>
            <name>sally</dog>
            <age>1</age>
        </dog>
        <dog>
            <name>susie</dog>
            <age>12</age>
        </dog>
    </dog-list>
    <bird-list>
        <bird>
            <name>cricket</name>
            <age>2</age>
        </bird>
    </bird-list>
    <people-list>
        <person>
            <name>tyler</name>
            <age>26</age>
        </person>
        <person>
            <name>ue</name>
            <age>25</age>
            <gender>female</gender>
        </person>
    </people-list>
    <car-list>
        <car>
            <make>mitsubishi</make>
            <model>evo x</model>
            <year>2013</year>
        </car>
    </car-list>
</profile>
#! /usr/bin/python2

import sys
from lxml import etree

result = etree.Element('root')
parser = etree.XMLParser(remove_blank_text=True)

# Add each file to the tree
for xmlfile in sys.argv[1:]:
  with open(xmlfile) as xmlfile:
    btree = etree.parse(xmlfile, parser)
  # Ensure that the resulting tree has the right root
  result.tag = btree.getroot().tag
  # Consider each 2nd-level item
  for bchild in btree.xpath("/*/*"):
    tags = result.xpath("./%s"%bchild.tag)
    if len(tags) == 0:
      # Add <dog-list>, for example
      #print "adding %s to %s"%(bchild.tag, result.tag)
      result.append(bchild)
    else:
      for bgrandchild in bchild:
        # add <dog>, for example
        #print "adding %s to %s"%(bgrandchild.tag, tags[0].tag)
        tags[0].append(bgrandchild)

with open("output.xml", "w") as output:
  output.write(etree.tostring(result, pretty_print = True))