从XML元素复制值以创建一个具有合并新值的新元素
我有一个包含多个产品的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)