gpt4 book ai didi

python - 如何使用 lxml.etree 在 XML 中查找相同的属性值?

转载 作者:太空宇宙 更新时间:2023-11-04 09:40:54 25 4
gpt4 key购买 nike

我有一个类似于下面输入的 XML。

这里我要聚合Sales Diesel 的值燃料类型。

如何遍历所有 <Tank>元素并阅读 fuelItem属性找到多次出现的相同燃料类型,然后总结 Sales属性值?

输入:

 <EnterpriseDocument>
<FuelTankList>
<Tank fuelItem="Petrol" Sales="1000" />
<Tank fuelItem="Diesel" Sales="2000" />
<Tank fuelItem="Diesel" Sales="3000" />
</FuelTankList>
</EnterpriseDocument>

首选输出:

<EnterpriseDocument>
<FuelTankList>
<Tank fuelItem="Petrol" netSalesQty="1000" />
<Tank fuelItem="Diesel" netSalesQty="5000" />
</FuelTankList>
</EnterpriseDocument>

最佳答案

由于您使用的是 lxml,因此可以使用 XSLT 和 Muenchian GroupingfuelItem 属性对 Tank 元素进行分组。

例子...

XML 输入 (input.xml)

<EnterpriseDocument>
<FuelTankList>
<Tank fuelItem="Petrol" Sales="1000" />
<Tank fuelItem="Diesel" Sales="2000" />
<Tank fuelItem="Diesel" Sales="3000" />
</FuelTankList>
</EnterpriseDocument>

XSLT 1.0 (测试.xsl)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="tanks" match="Tank" use="@fuelItem"/>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="FuelTankList">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each select="Tank[count(.|key('tanks',@fuelItem)[1])=1]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="Sales">
<xsl:value-of select="sum(key('tanks',@fuelItem)/@Sales)"/>
</xsl:attribute>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

python

from lxml import etree

tree = etree.parse("input.xml")
xslt = etree.parse("test.xsl")

new_tree = tree.xslt(xslt)

print(etree.tostring(new_tree, pretty_print=True).decode("utf-8"))

输出(标准输出)

<EnterpriseDocument>
<FuelTankList>
<Tank fuelItem="Petrol" Sales="1000"/>
<Tank fuelItem="Diesel" Sales="5000"/>
</FuelTankList>
</EnterpriseDocument>

关于python - 如何使用 lxml.etree 在 XML 中查找相同的属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51760142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com