我正在使用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>
答案 0 :(得分:1)
编写一个类来管理每种类型的xml文件。它应该有一个获取SKU列表的方法,并返回一组具有您感兴趣的属性的东西。
另一个采用该集合,并使用它修改它拥有的xml。
elementTree
限制xml,但查看您的示例文件,findall
方法是获取'sku'节点集合的良好开端。
不要试图一次性完成所有操作,打开每个文件并使用嵌套循环绝对不是可行的方法。
答案 1 :(得分:1)
我会这样做。有一些用于将Python字典转换为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())