我有一个XML文件,结构如下:
<?xml version="1.0"?>
<data>
<product>
<Product_Code>code1</Product_Code>
<Size>x</Size>
<Quantity>1<Quantity>
</product>
<product>
<Product_Code>code3</Product_Code>
<Size>c</Size>
<Quantity>5<Quantity>
</product>
<product>
<Product_Code>code2</Product_Code>
<Size>z</Size>
<Quantity>2<Quantity>
</product>
<product>
<Product_Code>code3</Product_Code>
<Size>a</Size>
<Quantity>1<Quantity>
</product>
<product>
<Product_Code>code1</Product_Code>
<Size>y</Size>
<Quantirt>1<Quantity>
</product>
<product>
<Product_Code>code3</Product_Code>
<Size>b</Size>
<Quantity>5<Quantity>
</product>
</data>
XML中有产品。每个产品都有代码,大小和数量。代码可能很常见。
我想选择与每个尺码对应的每个代码和数量对应的所有不同尺寸。我想在旅途中做。例如。如果迭代子元素并找到一个代码=&#34; code1&#34;的元素,我想在code =&#34; code1&#34;中查找根中的所有其他元素。及其相应的大小和数量值。
实际问题是生成以下XML:
<products>
<product>
<Product_Code>code1<Product_Code>
<variants>
<variant>
<size>x</size>
<quantity>1</quantity>
</variant>
<variant>
<size>y</size>
<quantity>1</quantity>
</variant>
</variants>
</product>
<product>
<Product_Code>code2<Product_Code>
<variants>
<variant>
<size>z</size>
<quantity>2</quantity>
</variant>
</variants>
</product>
<product>
<Product_Code>code3<Product_Code>
<variants>
<variant>
<size>a</size>
<quantity>1</quantity>
</variant>
<variant>
<size>b</size>
<quantity>5</quantity>
</variant>
<variant>
<size>c</size>
<quantity>5</quantity>
</variant>
</variants>
</product>
</products>
答案 0 :(得分:0)
这是我现在最好的,因为它在晚上或早上很晚,取决于你如何看待它。如果您在大量XML上执行此操作,可能需要进行一些优化,但这应该可以完成现在的工作,并且可以在Python 2.7 +上运行。
此解决方案使用字典将产品聚合在一起并创建变体子元素。然后,它遍历字典以使用产品代码创建新树,并将变体创建为子项。
import xml.etree.ElementTree as etree
tree = etree.parse('test.xml')
root = tree.getroot()
products = dict()
newroot = etree.Element('products')
for product in root.iterfind("product"):
product_code = product.find('Product_Code')
product.remove(product_code)
product.tag = "variant"
variants = products.setdefault(product_code.text,
etree.Element("variants"))
variants.append(product)
for product in products:
product_element = etree.Element('product')
product_code = etree.Element('Product_Code')
product_code.text = product
product_element.append(product_code)
product_element.append(products[product])
newroot.append(product_element)
result_xml = etree.tostring(newroot)