2017-04-25 109 views
0

我在下面有一個XML;使用minidom在python中解析XML

<root> 
<entry> 
    <accession>A</accession> 
    <accession>B</accession> 
    <accession>C</accession> 
    <feature type="cross-link" description="sumo2"> 
     <location> 
      <position position="15111992"/> 
     </location> 
    </feature> 
    <feature type="temp" description="blah blah sumo"> 
     <location> 
      <position position="12345"/> 
     </location> 
    </feature> 
</entry> 
<entry> 
    <accession>X</accession> 
    <accession>Y</accession> 
    <accession>Z</accession> 
    <feature type="test" description="testing"> 
     <location> 
      <position position="1"/> 
     </location> 
    </feature> 
    <feature type="cross-link" description="sumo hello"> 
     <location> 
      <position position="11223344"/> 
     </location> 
    </feature> 
</entry> 
</root> 

我需要獲取posiiton屬性,它的功能類型是「交聯」和描述中包含單詞相撲的價值。 這是我迄今爲止所嘗試的,它正確地給了我那些特徵類型爲「交叉鏈接」的值,並且描述包含了單詞sumo。

from xml.dom import minidom 
xmldoc = minidom.parse('P38398.xml') 
itemlist = xmldoc.getElementsByTagName('feature') 

for s in itemlist: 
    feattype = s.attributes['type'].value 
    description = s.attributes['description'].value 
    if "SUMO" in description: 
     if "cross-link" in feattype: 
      print feattype+","+description 

我怎樣才能提取的位置的值一旦我有特徵類型爲「交聯」和描述含有單詞「相撲」?

回答

0

就快成功了,除了兩點:

  • 你必須改變你的「相撲」的搜索模式,以小寫符合以上的
  • 給出的數據,那麼你需要添加類似以下內容您的循環體

    posList = s.getElementsByTagName('position') 
    for p in posList: 
        print "-- position is {}".format(p.attributes['position'].value) 
    
+0

非常感謝。 – Ghauri

0

這是XPath的工作。一個簡單的檢查attribute matchessubstring matches然後我們返回屬性作爲一個字符串。

from lxml import etree 
root = etree.parse('P38398.xml').getroot() 
xpquery = '//feature[@type="cross-link" and contains(@description, "sumo")]//position/@position' 
for att in root.xpath(xpquery): 
    print(att)