Python 元素树:如何找到具有相同属性值的所有下一个子元素

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文件:

<?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)

不确定你是否注意到我的答案。请让我知道,如果这是你正在寻找的,如果这是一个接受将不胜感激。如果没有,让我知道,我会看看我能做些什么来修改和帮助回答这个问题。谢谢