重新计算XML子元素

问题描述 投票:1回答:1

使用python3,我试图读取xml文件并根据Item中的属性重新计算值,然后使用新值编写整个xml文件的副本。

xml文件示例(完整文件中约有1万行):

<?xml version="1.0" encoding="utf-8"?>
<Items>
  <Item id="headscarf_d"
        name="{=wW3iouiU}Hijab"
        mesh="headscarf_d"
        culture="Culture.aserai"
        weight="0.5"
        value="63"
        appearance="1"
        Type="HeadArmor">
    <ItemComponent>
      <Armor head_armor="3"
             has_gender_variations="false"
             beard_cover_type="type3"
             hair_cover_type="all"
             modifier_group="cloth_unarmoured"
             material_type="Cloth"/>
    </ItemComponent>
    <Flags Civilian="true"
           UseTeamColor="true" />
  </Item>
  <Item id="open_head_scarf"
        name="{=qsVRoGUv}Open Head Scarf"
        mesh="aserai_helmet_c"
        culture="Culture.aserai"
        weight="0.6"
        value="174"
        appearance="1"
        Type="HeadArmor">
    <ItemComponent>
      <Armor head_armor="5"
             has_gender_variations="false"
             beard_cover_type="type3"
             hair_cover_type="all"
             modifier_group="cloth_unarmoured"
             material_type="Cloth"/>
    </ItemComponent>
    <Flags Civilian="true"
           UseTeamColor="true" />
  </Item>
  <Item id="woven_turban"
        name="{=ArPvuBYK}Woven Turban"
        subtype="head_armor"
        mesh="aserai_helmet_h"
        culture="Culture.aserai"
        weight="0.8"
        difficulty="0"
        value="250"
        appearance="1"
        Type="HeadArmor">
    <ItemComponent>
      <Armor head_armor="6"
             has_gender_variations="false"
             beard_cover_type="type2"
             hair_cover_type="all"
             modifier_group="cloth_unarmoured"
             material_type="Cloth"/>
    </ItemComponent>
    <Flags Civilian="true"
           UseTeamColor="true" />
  </Item>
</Items>

从示例xml中获取一项,

<Item id="headscarf_d"
        name="{=wW3iouiU}Hijab"
        mesh="headscarf_d"
        culture="Culture.aserai"
        weight="0.5"
        value="63"
        appearance="1"
        Type="HeadArmor">
    <ItemComponent>
      <Armor head_armor="3"
             has_gender_variations="false"
             beard_cover_type="type3"
             hair_cover_type="all"
             modifier_group="cloth_unarmoured"
             material_type="Cloth"/>
    </ItemComponent>
    <Flags Civilian="true"
           UseTeamColor="true" />

[为简单起见,我想取Item值(上面的示例为63)并除以2(63/2 = 31.5)。然后,如果项目的ItemComponent material_type =“ Cloth”再除以2(31.5 / 2 = 15.75)。最后四舍五入为整数,然后更新值并重复每个项目,然后写入新的更新的xml文件。

我尝试使用Reading, modifying and writing xml,但无法获得任何有用的信息。

python-3.x xml-parsing
1个回答
0
投票

您可能正在寻找符合以下条件的东西:

from lxml import etree
import math

inv="""[your xml above]"""
doc = etree.XML(inv)

values = doc.xpath('//Item')
materials  = doc.xpath('Item//ItemComponent//Armor')
for t, m in zip(values,materials):
    if m.attrib['material_type'] == 'Cloth':
        val = float(t.attrib['value'])/4
        t.attrib['value'] = str(math.ceil(val))
    else:
        t.attrib['value']= str(math.ceil(val*2))
print(etree.tostring(doc).decode())

输出是您的xml,其Items/Item/@value属性值除以2或4,并根据需要四舍五入。由于Items具有cloth作为属性material_type的值,因此将它们全部除以4并四舍五入为:

16
44
63
© www.soinside.com 2019 - 2024. All rights reserved.