2011/02/17

Парсим XML

Даны два xml-файла, отличающиеся только атрибутами
Файл 1:
<root>
<nodeA val1="1" val2="2" val3="3">
<nodeB val1="1" val2="2" val3="3"/>
</nodeA>
<nodeC val1="1" val2="2" val3="3"/>
</root>
Файл 2:
<root>
<nodeA val1="1" val2="X" val4="4">
<nodeB val1="1" val2="X" val4="4"/>
</nodeA>
<nodeC val1="1" val2="X" val4="4"/>
</root>
Надо реализовать на любом скриптовом языке слияние Файла 1 в Файл 2 так, чтобы в Файле 2:
1) остались уникальные атрибуты Файла 2;
2) присутствовали уникальные атрибуты Файла 1;
3) совпадающие атрибуты имели значения из Файл 1.

Я делал с помощью модуля lxml, которой нет в стандартной поставке питона. Чтобы использовать стандартный модуль xml, надо просто заменить первую строчку на import xml.etree.ElementTree as etree - интерфейсы в этом случае одинаковые.

from lxml import etree

file1 = open('1.xml', 'r')
tree1 = etree.parse(file1)
file1.close()
root1 = tree1.getroot()

file2 = open('2.xml', 'r')
tree2 = etree.parse(file2)
file2.close()
root2 = tree2.getroot()

for i in range(len(root1)):
    for ikey in root1[i].keys():
        root2[i].attrib[ikey] = root1[i].attrib[ikey]

    if len(root1[i]) > 0:
        for j in range(len(root1[i])):
            for jkey in root1[i][j].keys():
                root2[i][j].attrib[jkey] = root1[i][j].attrib[jkey]

file2 = open('2.xml', 'w')
file2.write(etree.tostring(root2))
file2.close()

Атрибуты и их значения здесь представлены в виде словарей, поэтому ими можно легко манипулировать. Более подробная информация здесь: http://lxml.de/tutorial.html

No comments:

Post a Comment