Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用lxml一次对一个.xml项(及其子项)执行函数操作_Python_Xml Parsing_Lxml - Fatal编程技术网

Python 使用lxml一次对一个.xml项(及其子项)执行函数操作

Python 使用lxml一次对一个.xml项(及其子项)执行函数操作,python,xml-parsing,lxml,Python,Xml Parsing,Lxml,请注意,我正在使用像这样导入的lxml:来自lxml导入etree 我正在努力使一些工作代码更加灵活。我的脚本获取一个输入.xml文件,该文件包含按名称排序的所有项目,引用一个包含项目ID号和项目名称的字典,以根据该.xml文件生成项目ID列表,然后轮询web服务器以获取这些项目ID的价格数据,然后使用这些数据输出总成本。我的问题与这些步骤无关 相反,我的问题是如何处理对包含多个顺序的.xml文件的解析 到目前为止,我的示例.xml文件可能如下所示: <?xml version="1.0"

请注意,我正在使用像这样导入的lxml:
来自lxml导入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>
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'))))
<?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>
它会给我一个名为
modlist
的列表,比如
['Model1'、'leatherseats'、'6碟CD播放器']
我可以运行我的其他功能来获取这些项目的ID号,然后从中获取价格信息,并将其合计,以了解这辆配备真皮座椅升级和6碟CD播放机升级的1型车的成本

这就是我遇到困难的地方。如何在一个.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>
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'))))
<?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个数字—1型车及其升级的总价格,3型车及其升级的总价格,以及7型车及其升级的总价格


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

不要调用
root.iterchildren
,而是使用
order.iterchildren
,其中
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

我设法让它工作,尽管它不是我最初计划的那样。使用此方法,我必须在root.xpath('//order'):
中对order执行所有剩余的数据处理,这需要重新构造大量代码,但它可以工作:)