从XML元素复制值以创建一个具有合并新值的新元素

0 投票
1 回答
28 浏览
提问于 2025-04-13 03:19

我有一个包含多个产品的XML文件,我想在每个标题为的地方添加一个新元素,这个新元素要包含其他元素的值。我想在每个标题为的地方添加一个新元素,这个新元素应该包括ProductOption、PurchaseOption和Quantity的值。举个例子,应该看起来像<sku>price-each-an-order-250-499</sku>

输入的XML文件

<Catalog>
    <Product>
        <Number>82508</Number>
        <Title>Product Title</Title>
        <Description>description</Description>
        <Variations>
            <!-- An Order; no imprint -->
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>250-499</Quantity>
                <MinQuantity>250</MinQuantity>
                <MaxQuantity>499</MaxQuantity>
                <Price>1.09</Price>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>500-999</Quantity>
                <MinQuantity>500</MinQuantity>
                <MaxQuantity>999</MaxQuantity>
                <Price>0.95</Price>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>1000-2499</Quantity>
                <MinQuantity>1000</MinQuantity>
                <MaxQuantity>2499</MaxQuantity>
                <Price>0.93</Price>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>2500-4999</Quantity>
                <MinQuantity>2500</MinQuantity>
                <MaxQuantity>4999</MaxQuantity>
                <Price>0.87</Price>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>5000</Quantity>
                <MinQuantity>5000</MinQuantity>
                <MaxQuantity></MaxQuantity>
                <Price>0.84</Price>
            </Variation>
            <!-- A Quote; no imprint -->
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>A Quote</PurchaseOption>
                <Quantity></Quantity>
                <MinQuantity></MinQuantity>
                <MaxQuantity></MaxQuantity>
                <Price>0.00</Price>
            </Variation>
            <!-- A Sample; no imprint -->
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>A Sample</PurchaseOption>
                <Quantity>1</Quantity>
                <MinQuantity>1</MinQuantity>
                <MaxQuantity>1</MaxQuantity>
                <Price>0.00</Price>
            </Variation>
        </Variations>
    </Product>
</Catalog>

期望的输出

<Catalog>
    <Product>
        <Number>82508</Number>
        <Title>Product Title</Title>
        <Description>description</Description>
        <Variations>
            <!-- An Order; no imprint -->
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>250-499</Quantity>
                <MinQuantity>250</MinQuantity>
                <MaxQuantity>499</MaxQuantity>
                <Price>1.09</Price>
                <Sku>price-each-an-order-250-499</sku>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>500-999</Quantity>
                <MinQuantity>500</MinQuantity>
                <MaxQuantity>999</MaxQuantity>
                <Price>0.95</Price>
                <Sku>price-each-an-order-500-999</sku>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>1000-2499</Quantity>
                <MinQuantity>1000</MinQuantity>
                <MaxQuantity>2499</MaxQuantity>
                <Price>0.93</Price>
                <Sku>price-each-an-order-1000-2499</sku>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>2500-4999</Quantity>
                <MinQuantity>2500</MinQuantity>
                <MaxQuantity>4999</MaxQuantity>
                <Price>0.87</Price>
                <Sku>price-each-an-order-2500-4999</sku>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>5000</Quantity>
                <MinQuantity>5000</MinQuantity>
                <MaxQuantity></MaxQuantity>
                <Price>0.84</Price>
                <Sku>price-each-an-order-5000</sku>
            </Variation>
            <!-- A Quote; no imprint -->
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>A Quote</PurchaseOption>
                <Quantity></Quantity>
                <MinQuantity></MinQuantity>
                <MaxQuantity></MaxQuantity>
                <Price>0.00</Price>
                <Sku>price-each-a-quote</sku>
            </Variation>
            <!-- A Sample; no imprint -->
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>A Sample</PurchaseOption>
                <Quantity>1</Quantity>
                <MinQuantity>1</MinQuantity>
                <MaxQuantity>1</MaxQuantity>
                <Price>0.00</Price>
                <Sku>price-each-a-sample-1</sku>
            </Variation>
        </Variations>
    </Product>
</Catalog>

我不太确定该用什么工具来实现这个功能。任何示例或教程都会很有帮助。

1 个回答

0

这里有一个用Python的 xml.etree.ElementTree 模块的解决方案。你可以在这里找到相关的文档。

import xml.etree.ElementTree as ET

xml_str = """
<Catalog>
    <Product>
        <Number>82508</Number>
        <Title>Product Title</Title>
        <Description>description</Description>
        <Variations>
            <!-- An Order; no imprint -->
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>250-499</Quantity>
                <MinQuantity>250</MinQuantity>
                <MaxQuantity>499</MaxQuantity>
                <Price>1.09</Price>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>500-999</Quantity>
                <MinQuantity>500</MinQuantity>
                <MaxQuantity>999</MaxQuantity>
                <Price>0.95</Price>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>1000-2499</Quantity>
                <MinQuantity>1000</MinQuantity>
                <MaxQuantity>2499</MaxQuantity>
                <Price>0.93</Price>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>2500-4999</Quantity>
                <MinQuantity>2500</MinQuantity>
                <MaxQuantity>4999</MaxQuantity>
                <Price>0.87</Price>
            </Variation>
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>An Order</PurchaseOption>
                <Quantity>5000</Quantity>
                <MinQuantity>5000</MinQuantity>
                <MaxQuantity></MaxQuantity>
                <Price>0.84</Price>
            </Variation>
            <!-- A Quote; no imprint -->
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>A Quote</PurchaseOption>
                <Quantity></Quantity>
                <MinQuantity></MinQuantity>
                <MaxQuantity></MaxQuantity>
                <Price>0.00</Price>
            </Variation>
            <!-- A Sample; no imprint -->
            <Variation>
                <ProductOption>Price Each</ProductOption>
                <PurchaseOption>A Sample</PurchaseOption>
                <Quantity>1</Quantity>
                <MinQuantity>1</MinQuantity>
                <MaxQuantity>1</MaxQuantity>
                <Price>0.00</Price>
            </Variation>
        </Variations>
    </Product>
</Catalog>"""

root = ET.fromstring(xml_str)

val_list = ['ProductOption','PurchaseOption','Quantity']

for elem in root.findall('.//Variation'):
    sku_tex = []
    sku = ET.Element('Sku')
    elem.append(sku)
    for item in elem.iter():
        if item.tag in val_list and item.text is not None:
            el = item.text.lower().replace(' ','-')+'-'
            sku_tex.append(el)
    sku.text = ''.join(sku_tex).rstrip('-')
    
tree = ET.ElementTree(root)
ET.indent(tree, space='  ')
ET.dump(tree)

撰写回答