使用Python ElementTree提取XML的特定行

时间:2012-11-24 16:59:33

标签: python xml elementtree

我对使用Python的项目有点困惑 - 我很新。我被告知要使用ElementTree并从传入的XML文件中获取指定的数据。这听起来很简单,但我不擅长编程。下面是一个(非常!)微小的传入文件示例以及我尝试使用的代码。

我想要接下来的任何提示或地点。我已经尝试过搜索并关注其他人所做的事情,但我似乎无法得到相同的结果。我的目的是获取“活动”,“房间”和“方向”中包含的信息,但稍后我将需要获得更多信息。

我已经尝试过使用XPath但它运行得不太好,特别是对于xml使用的命名空间以及我需要的所有内容的XPath都会变得太大。我已经简化了示例,因此我可以理解要执行的原则,因为在此之后必须扩展它以从“AssetEquipment”及其多个实例中获取更多信息。然后最终目标是将一个设备保存到字典中的所有信息,以便我以后可以操作它,每个新设备都在自己独立的字典中。

示例XML:

<AssetData>
<Equipment>
    <AssetEquipment ID="3" name="PC960">
        <Active>Yes</Active>
        <Location>
            <RoomLocation>
                <Room>23</Room>
                <Area>
                    <X-Area>-1</X-Area>
                    <Y-Area>2.4</Y-Area>
                </Area>
            </RoomLocation>
        </Location>
        <Direction>Positive</Direction>
        <AssetSupport>12</AssetSupport>
    </AssetEquipment>
</Equipment>

示例代码:

tree = ET.parse('C:\Temp\Example.xml')
root = tree.getroot()

ns = "{http://namespace.co.uk}"

for equipment in root.findall(ns + "Equipment//"):
    tagname = re.sub(r'\{.*?\}','',equipment.tag)
    name = equipment.get('name')

    if tagname == 'AssetEquipment':
        print "\tName: " + repr(name)
        for attributes in root.findall(ns + "Equipment/" + ns + "AssetEquipment//"):
            attname = re.sub(r'\{.*?\}','',attributes.tag)
            if tagname == 'Room': #This does not work but I need it to be found while
                                  #in this instance of "AssetEquipment" so it does not
                                  #call information from another asset instead.
                room = equipment.text
                print "\t\tRoom:", repr(room)

1 个答案:

答案 0 :(得分:2)

import xml.etree.cElementTree as ET
tree = ET.parse('test.xml')
for elem in tree.getiterator():
    if elem.tag=='{http://www.namespace.co.uk}AssetEquipment':
        output={}
        for elem1 in list(elem):
            if elem1.tag=='{http://www.namespace.co.uk}Active':
                output['Active']=elem1.text
            if elem1.tag=='{http://www.namespace.co.uk}Direction':
                output['Direction']=elem1.text
            if elem1.tag=='{http://www.namespace.co.uk}Location':
                for elem2 in list(elem1):
                    if elem2.tag=='{http://www.namespace.co.uk}RoomLocation':
                        for elem3 in list(elem2):
                            if elem3.tag=='{http://www.namespace.co.uk}Room':
                                output['Room']=elem3.text
        print output