元素树:如何找到具有特定值的所有子元素

1 投票
1 回答
795 浏览
提问于 2025-04-17 23:17

我有一个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里面有一些产品。每个产品都有一个代码、大小和数量。代码可能是重复的。

我想要选出每个代码对应的所有不同大小,以及每个大小对应的数量。比如说:

{code1: {x:1, y:1}, code2: {z:2}, code3: {a:1,b:5,c:5}

补充说明: 我想在处理的过程中做到这一点。比如说,如果我遍历子元素时:

tree = ET.parse(file)
root = tree.getroot()
for child in root:
    code = child.find('Product_Code')

如果代码是“code1”,我想找到根节点中所有代码为“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 个回答

2

首先,你的xml文件有问题,注意到QuantiryQuantity标签不匹配。

不过,下面是一个方法,可以让你获取每个代码对应的所有尺寸:

from xml.etree import ElementTree as ET


data = """<?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>
    <Quantity>1</Quantity>
</product>
<product>
    <Product_Code>code3</Product_Code>
    <Size>b</Size>
    <Quantity>5</Quantity>
</product>
</data>"""

tree = ET.fromstring(data)

codes = {}
for product in tree.findall('.//product'):
    code = product.find('Product_Code').text
    size = product.find('Size').text
    quantity = product.find('Quantity').text

    codes[code] = codes[code] if code in codes else {}
    codes[code][size] = quantity

print codes

输出结果是:

{'code1': {'y': '1', 'x': '1'}, 'code2': {'z': '2'}, 'code3': {'a': '1', 'c': '5', 'b': '5'}}

撰写回答