Python:如何组合来自多个XML文件的数据

时间:2014-03-08 19:30:09

标签: python xml elementtree

我正在使用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>

我想将2个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 个答案:

答案 0 :(得分:1)

编写一个类来管理每种类型的xml文件。它应该有一个获取SKU列表的方法,并返回一组具有您感兴趣的属性的东西。

另一个采用该集合,并使用它修改它拥有的xml。

elementTree限制xml,但查看您的示例文件,findall方法是获取'sku'节点集合的良好开端。

不要试图一次性完成所有操作,打开每个文件并使用嵌套循环绝对不是可行的方法。

答案 1 :(得分:1)

我会这样做。有一些用于将Python字典转换为XML的方法。

  1. 读入每个文件并将其转换为字典词典,其中外键是SKU,内部词典是所有其他元素。
  2. 创建一个主词典,其中包含每个文件中的词典(请参阅此combining dictionaries
  3. 使用结果
  4. 创建一个xml文件

    如果您需要保留订单,请使用Ordered dictionaries。

    当我写这篇文章时,我觉得从字典到json到xml可能更容易 -

答案 2 :(得分: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())
相关问题