Python 元素树:如何找到具有相同属性值的所有下一个子元素
我有一个具有以下结构的XML文件:Python 元素树:如何找到具有相同属性值的所有下一个子元素,python,xml,Python,Xml,我有一个具有以下结构的XML文件: <?xml version="1.0"?> <data> <product> <Product_Code>code1</Product_Code> <Size>x</Size> <Quantity>1<Quantity> </product> <product> <Product_Code&g
<?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>
代码1
x
1.
代码3
C
5.
代码2
Z
2.
代码3
A.
1.
代码1
Y
1.
代码3
B
5.
XML中有一些产品。每个产品都有代码、大小和数量。代码可以是通用的
我想选择每个代码对应的所有不同尺寸和每个尺寸对应的数量。我想边走边做。例如,如果遍历子元素as并使用code=“code1”查找元素,我希望使用code=“code1”查找根中的所有其他元素及其相应的大小和数量值
实际问题是生成以下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>
代码1
x
1.
Y
1.
代码2
Z
2.
代码3
A.
1.
B
5.
C
5.
这是我目前所能做的最好的,因为它是在晚上或早上很晚的时候,这取决于你如何看待它。如果要在大量XML上执行此操作,可能需要进行一些优化,但现在应该可以完成这项工作,并且可以在Python2.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)
不确定你是否注意到我的答案。请让我知道,如果这是你正在寻找的,如果这是一个接受将不胜感激。如果没有,让我知道,我会看看我能做些什么来修改和帮助回答这个问题。谢谢