2012-11-24 34 views
1

我有點卡在我正在做的使用Python的項目上 - 我很新。我被告知使用ElementTree並從傳入的XML文件中獲取指定的數據。這聽起來很簡單,但我不擅長編程。下面是一個(非常!)一個傳入文件的小例子,以及我正在嘗試使用的代碼。使用Python提取XML的特定行ElementTree

我想任何提示或地方去與此。我嘗試過搜索並追蹤其他人做了什麼,但我似乎無法獲得相同的結果。我的目標是獲得包含在「活動」,「房間」和「方向」中的信息,但稍後我需要獲得更多信息。

我已經嘗試過使用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) 
+0

如何['xmltodict'](http://pypi.python.org/pypi/ xmltodict/0.2)? –

回答

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