Python:如何合并多个XML文件的数据

1 投票
3 回答
5861 浏览
提问于 2025-04-17 21:27

我正在使用Element Tree来解析XML文件。我有多个XML文件。这些XML文件中的元素是通过一个独特的键(SKU)来识别的,但其他标签是不同的。我想把每个元素对应的标签合并到另一个文件中。为此,我可以开始解析第一个XML的每个子元素,然后循环遍历其他文件的子元素,以找到具有给定SKU的元素:

tree = ET.parse(filename)
root = tree.getroot()
tree1 = ET.parse(filename1)
root1 = tree1.getroot()
...#more xmls
for child in root:
    sku = child.find('SKU').text
    for child1 in root1:
        sku1 = child1.find('SKU').text
        if sku == sku1:
            #do something

但是我意识到这种方法效率不是很高。有没有更好的方法呢?

谢谢

补充说明:比如,第一个XML的元素形式如下:

<product>
    <SKU>ABCD1234</SKU>
    <_Image>something</_Image>
    <_Image_Count>2</_Image_Count>
    <_Image2>something</_Image2>
    <_Image3>something</_Image3>
    <_Orignal_Image>something</_Orignal_Image>
</product>

而第二个XML的元素形式如下:

<product>
    <Product_Code>ABCD1234</Product_Code>
    <Designer>xxx</Designer>
    <Taxon>yyy</Taxon>
    <Parent_Taxon>zzz</Parent_Taxon>
    <Taxonomy>aaa</Taxonomy>
    <Quantity>1</Quantity>
    <Cost>2</Cost>
    <MRP>3</MRP>
    <Price>4</Price>
</product>

我想把这两个XML合并成:

<product>
    <SKU>ABCD1234</SKU>
    <_Image>something</_Image>
    <_Image_Count>2</_Image_Count>
    <_Image2>something</_Image2>
    <_Image3>something</_Image3>
    <_Orignal_Image>something</_Orignal_Image>
    <Product_Code>ABCD1234</Product_Code>
    <Designer>xxx</Designer>
    <Taxon>yyy</Taxon>
    <Parent_Taxon>zzz</Parent_Taxon>
    <Taxonomy>aaa</Taxonomy>
    <Quantity>1</Quantity>
    <Cost>2</Cost>
    <MRP>3</MRP>
    <Price>4</Price>
</product>

3 个回答

1

我建议你看看这个叫做 BeautifulSoup 的库。

我写了一个小示例代码,用来创建合并后的XML文件。

from bs4 import BeautifulSoup

first = BeautifulSoup(open("first.xml"), "lxml")

first_as_dict = dict([(x.text, x.parent()) for x in first.find_all("sku")])

second = BeautifulSoup(open("second.xml"), "lxml")
# The actual tag name in your sample XML is "product_code",
# its not "SKU" as in the first one, change this if that is not correct
second_as_dict = dict([(x.text, x.parent()) for x in second.find_all("product_code")])

combined = BeautifulSoup("", "lxml")

for key, value in first_as_dict.iteritems():
    product_tag = combined.new_tag("product")
    items = value + second_as_dict[key]
    for item in items:
        product_tag.append(item)
    combined.append(product_tag)

print(combined.prettify())
1

我会用不同的方法来处理这个问题。将Python字典转换成XML有几种方法。

  1. 首先,读取每个文件,把它们转换成一个字典的字典。外层的键是SKU,内层的字典包含其他所有的元素。
  2. 然后,创建一个主字典,把每个文件的字典合并在一起(关于合并字典的内容可以参考一下)。
  3. 最后,使用结果创建一个XML文件。

如果你需要保持顺序,可以使用有序字典。

在我写这些的时候,我觉得从字典转换到JSON再到XML可能会更简单。

1

写一个类来管理每种类型的xml文件。这个类应该有一个方法,可以接收一个SKU的列表,然后返回一个包含你感兴趣的属性的东西的集合。

还有另一个方法,可以接收这个集合,并使用它来修改它所拥有的xml文件。

elementTree对xml的支持有限,但根据你的示例文件,findall方法是个不错的起点,可以用来获取一组'sku'节点。

不要试图一次性完成所有事情,打开每个文件并使用嵌套循环绝对不是一个好办法。

撰写回答