2

请注意,我正在使用这样导入的 lxml from lxml import etree:.

我正在尝试使一些工作代码更加灵活。我的脚本采用包含按名称顺序排列的所有项目的输入 .xml 文件,引用包含项目 ID 号和项目名称的字典以根据该 .xml 文件生成项目 ID 列表,然后轮询 Web 服务器这些项目 ID 的价格数据,然后用于输出总成本。我的问题不是关于这些步骤中的任何一个。

相反,我的问题是关于如何处理解析包含多个订单的 .xml 文件。

到目前为止,我的示例 .xml 文件可能如下所示:

<?xml version="1.0" ?>
    <cars>
        <order="This is a test order">
            <description value=""/>
            <carType value="Model1"/>
            <upgrade slot="interior 0" type="Leather Seats"/>
            <upgrade slot="interior 1" type="6-Disc CD Player"/>
        </order>
    </cars>

我可以将其解析为一个列表,其中包括基本项目 carType(这是汽车的型号)和各种升级,如下所示:

for element in root.iterchildren('carType'):
    modlist.append ("%s" % (element.get('value')))

for element in root.iter('upgrade'):
    modlist.append ("%s" % str.upper((element.get('type'))))

它会给我一个名为的列表modlist['Model1', 'Leather Seats', '6-Disc CD Player']我可以通过我的其他函数来获取这些物品的 ID 号,然后从那里获取价格信息并将其汇总,以找出这款带有真皮座椅升级的 Model1 汽车的价格和升级 6 碟 CD 播放器需要花费。

这是我遇到困难的地方。如何在一个 .xml 文件中拥有多辆汽车?一个示例可能如下所示:

<?xml version="1.0" ?>
    <cars>
        <order="This is a test order">
            <description value=""/>
            <carType value="Model1"/>
            <upgrade slot="interior 0" type="Leather Seats"/>
            <upgrade slot="interior 1" type="6-Disc CD Player"/>
        </order>
        <order="This is a 2nd order">
            <description value=""/>
            <carType value="Model3"/>
            <upgrade slot="interior 0" type="Vinyl Seats"/>
            <upgrade slot="wheels 0" type="Chrome Wheels"/>
            <upgrade slot="wheels 1" type="8 Ply Tires"/>
        </order>
        <order="This is a 3rd order">
            <description value=""/>
            <carType value="Model7"/>
            <upgrade slot="engine 0" type="V8"/>
            <upgrade slot="interior 0" type="Leather Seats"/>
            <upgrade slot="interior 1" type="Sunroof"/>
        </order>
    </cars>

我想一次在一个订单上运行我的函数,这样这个例子就会输出 3 个数字——这辆 Model1 车及其升级的总价、Model3 车的升级总价和总价Model7 汽车的升级版。

如何告诉我的函数一次只运行一个订单?我正在考虑一些事情,iterchild()但我什么也做不了。

4

1 回答 1

1

而不是调用root.iterchildren, use order.iterchildren, whereorder遍历<order>元素:

for order in root.xpath('//order'):
    modlist = []
    for element in order.iterchildren('carType'):
        modlist.append ("%s" % (element.get('value')))

    for element in order.iter('upgrade'):
        modlist.append ("%s" % str.upper((element.get('type'))))
    # report grand total for order
于 2012-10-01T01:04:19.387 回答