用elemen排序嵌套元素

2024-10-01 05:01:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用带有elementree的XML属性对XML文件中大量嵌套的元素进行排序。我需要阅读的XML元素的结构如下:

<ChargeItem>
   <!-- some other data-->  
   <SupplementaryOffer OfferID=SomeIdNumber>
       <!-- more data-->  
   </SupplementaryOffer>
</ChargeItem>

我的代码下一步应该做:

  1. 解析XML文件,获取SupplementaryOffer标记
  2. 读取OfferID属性
  3. 基于查找列表添加新属性OrderID
  4. 根据ChargeItem内的OrderID对每个SuplementaryOffer排序

我现在需要做的是:对每个SupplementaryOffer(4)进行排序 此代码:

for c in tree.iter("ChargeItem"):
    c[:] = sorted(c, key=lambda child: (child.tag,child.get('OrderId')))

这是我用来尝试和排序,但据我所知,这是没有任何功能

以下是已添加“OrderId”属性的现有XML的缩减:

<BATCH >
    <BILL>
        <Somebillinfo>0</Somebillinfo>
        <INVtype>2</INVtype>
        <PageOne>
            <Stuff></Stuff>
        </PageOne>
        <Page2>
            <ServiceAddressCharges>
                <ServiceAddress>
                    <ServiceAddress1>221B Baker Street</ServiceAddress1>
                </ServiceAddress>
                <ProductsSection>
                    <BrilliantProducts id="20033" DisplayMethod="0">Snack services
                        <ChargeItemList>
                            <ServiceNo>0123456478</ServiceNo>
                            <PrimaryOffer OfferId="80000000">Blueberry Icecream</PrimaryOffer>
                            <ParentBundle SortKey="NO_BUNDLE" ParentBundleId="0" ConnectReason="0" DisconnectReason="0">
                                <Bundle SortKey="NO_BUNDLE" BundleId="0" ConnectReason="0" DisconnectReason="0">
                                    <ChargeItem SortKey="ICE">
                                        <SupplementaryOffer OfferId="80000000" ConnectReason="1" DisconnectReason="0" OrderId="23">Fishfingers & Custard
                                            <MonthAmount ProrateCode="0" BillRecur="4" FromDate="2019-07-11" ToDate="2019-08-10" Discount="0.00" Qty="1">4.00</MonthAmount>
                                        </SupplementaryOffer>
                                        <SupplementaryOffer OfferId="80000132" ConnectReason="1" DisconnectReason="0" OrderId="2">A large amount of potato
                                            <MonthAmount ProrateCode="0" BillRecur="71" FromDate="2019-07-11" ToDate="2019-08-10" Discount="0.00" Qty="1">1.00</MonthAmount>
                                        </SupplementaryOffer>
                                    </ChargeItem>
                                    <ChargeItem SortKey="NODSP">
                                        <SupplementaryOffer OfferId="80003606" ConnectReason="1" DisconnectReason="0" OrderId="10">Smaller amount of potato
                                            <DateStart>2016-11-04</DateStart>
                                            <UsageAmount Discount="627.68">630.13</UsageAmount>
                                            <UsageItem>
                                                <ChargeDescr>IncludedSnacks</ChargeDescr>
                                            </UsageItem>
                                            <UsageItem>
                                                <ChargeDescr>SharedSnacks</ChargeDescr>
                                            </UsageItem>
                                        </SupplementaryOffer>
                                        <SupplementaryOffer OfferId="80000132" ConnectReason="1" DisconnectReason="0" OrderId="2">A ginormous amount of potato
                                            <MonthAmount ProrateCode="0" BillRecur="71" FromDate="2019-07-11" ToDate="2019-08-10" Discount="0.00" Qty="1">1.00</MonthAmount>
                                        </SupplementaryOffer>
                                    </ChargeItem>
                                </Bundle>
                            </ParentBundle>
                        </ChargeItemList>
                    </BrilliantProducts>
                </ProductsSection>
            </ServiceAddressCharges>
        </Page2>
    </BILL>
</BATCH >

基于“OrderID”属性的排序,我希望第一个“ChargeItem”的结果是:

<ChargeItem SortKey="ICE">
    <SupplementaryOffer OfferId="80000132" ConnectReason="1" DisconnectReason="0" OrderId="2">A large amount of potato
        <MonthAmount ProrateCode="0" BillRecur="71" FromDate="2019-07-11" ToDate="2019-08-10" Discount="0.00" Qty="1">1.00</MonthAmount>
    </SupplementaryOffer>
    <SupplementaryOffer OfferId="80000000" ConnectReason="1" DisconnectReason="0" OrderId="23">Fishfingers & Custard
        <MonthAmount ProrateCode="0" BillRecur="4" FromDate="2019-07-11" ToDate="2019-08-10" Discount="0.00" Qty="1">4.00</MonthAmount>
    </SupplementaryOffer>
</ChargeItem>

Tags: 属性排序discountxmlfromdatechargeitemorderidsortkey