Добавление данных XML из файла XML в существующий файл XML

Я новичок в Python, только прочитал Узнай Python на собственном опыте. Но я думаю, что это все еще выходит за рамки моей компетенции. Мои навыки связаны с XML/XSL, а не с Python. Мне нужна небольшая помощь, чтобы начать.

Обзор. Мне нужно добавить отсутствующие данные XML (addition.xml) в существующий файл XML (original.xml).

Файл XML (с отсутствующими данными): (addition.xml)

<profile>
    <dog-list>
        <dog>
            <name>sally</dog>
            <age>1</age>
        </dog>
        <dog>
            <name>susie</dog>
            <age>12</age>
        </dog>
    </dog-list>
    <people-list>
        <person>
            <name>ue</name>
            <age>25</age>
            <gender>female</gender>
        </person>
    </people-list>
</profile>

Данные XML, указанные выше, добавляются в этот XML-файл: (original.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>

Ожидаемый результат должен быть следующим: --> новый (original.xml)

<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>

Здесь происходит следующее: данные из add.xml отсутствуют в исходном файле.xml. Как мне добавить данные из add.xml в исходный.xml вместо того, чтобы создавать новый файл, перезаписывая его.

Я просматриваю весь google и stackoverflow. Я знаю, что мог бы использовать ElementTree, но у меня нет ни малейшего представления о том, как создать этот результат.

Любая помощь приветствуется!


person misterbear    schedule 15.01.2014    source источник
comment
Ваши данные xml недействительны: обратите внимание на несоответствие открывающих и закрывающих тегов.   -  person alecxe    schedule 16.01.2014
comment
Фиксированный. Извините, я напечатал это и пропустил закрывающий тег </bird-list>   -  person misterbear    schedule 16.01.2014
comment
Важен ли порядок элементов? Должен ли <dog-list> идти после <cat-list>?   -  person Robᵩ    schedule 16.01.2014
comment
И он не перезаписывает файл и не создает новый файл. Он просто печатает его в терминале.   -  person misterbear    schedule 16.01.2014
comment
Я также понял, что потребовался только последний недостающий узел. Так что, если бы было более одного <dog>, он взял бы последний (susie).   -  person misterbear    schedule 16.01.2014


Ответы (1)


Ваши требования не позволяют использовать программу слияния общего назначения (например, ту, на которую вы ссылаетесь), но вот программа, которая может вам подойти.

Использование: ./program.py original.xml add.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))
person Robᵩ    schedule 16.01.2014