Даны два xml-файла, отличающиеся только атрибутами
Файл 1:
1) остались уникальные атрибуты Файла 2;
2) присутствовали уникальные атрибуты Файла 1;
3) совпадающие атрибуты имели значения из Файл 1.
Я делал с помощью модуля lxml, которой нет в стандартной поставке питона. Чтобы использовать стандартный модуль xml, надо просто заменить первую строчку на import xml.etree.ElementTree as etree - интерфейсы в этом случае одинаковые.
Атрибуты и их значения здесь представлены в виде словарей, поэтому ими можно легко манипулировать. Более подробная информация здесь: http://lxml.de/tutorial.html
Файл 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()
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