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

时间:2014-03-22 04:25:45

标签: python xml

我有一个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>

1 个答案:

答案 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)