Разбор XML в python с помощью minidom

У меня есть 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, тип функции которого — «перекрестная ссылка», а описание содержит слово сумо. Это то, что я пробовал до сих пор, что правильно дает мне те значения, тип функции которых «перекрестная ссылка», а описание содержит слово сумо.

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

Как я могу извлечь значение позиции, если у меня есть тип функции как «перекрестная ссылка» и описание, содержащее слово «сумо»?


person Ghauri    schedule 25.04.2017    source источник


Ответы (2)


Вы почти у цели, за исключением двух моментов:

  • Вы должны изменить свой шаблон поиска «сумо» на нижний регистр, чтобы соответствовать данным, приведенным выше.
  • Затем вам нужно добавить что-то вроде следующего в тело цикла

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

Это работа для XPath. Простая проверка соответствия атрибутов и соответствует подстроке, а затем мы возвращаем атрибут в виде строки.

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)
person miken32    schedule 25.04.2017