<p>试试这个:</p>
<pre><code>from lxml import etree
# Parse the input XML file.
tree = etree.parse(open("so-input.xml"))
# Collect Tank element attributes here.
tanks = {}
# The FuelTankList element whose children we will change.
fuel_tank_list = None
# Loop over all Tank elements, collect their values, remove them.
for tank in tree.xpath("//Tank"):
# Get attributes.
fuel_item = tank.get("fuelItem")
sales = tank.get("Sales")
# Add to sales sum.
existing_sales = tanks.get(fuel_item, 0)
tanks[fuel_item] = existing_sales + int(sales)
# Remove <Tank>
fuel_tank_list = tank.getparent()
fuel_tank_list.remove(tank)
# Creat a new Tank element for each fuelItem value.
for fuel_item, sales in tanks.items():
new_tank = etree.Element("Tank")
new_tank.attrib["fuelItem"] = fuel_item
new_tank.attrib["Sales"] = str(sales)
fuel_tank_list.append(new_tank)
# Write the modified tree to a new file.
with open("so-output.xml", "wb") as f:
f.write(etree.tostring(tree, pretty_print=True))
</code></pre>
<p><code>$ xmllint -format so-output.xml</code>的输出:</p>
^{pr2}$