使用 minidom 解析 python 中的 XML

Parsing XML in python using 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>

我需要获取特征类型为"cross-link"且描述包含单词sumo的posiiton属性的值。 到目前为止,这是我尝试过的方法,它正确地为我提供了那些特征类型为 "cross-link" 并且描述中包含相扑一词的值。

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

当特征类型为 "cross-link" 且描述包含单词 "sumo" 时,如何提取位置值?

除了两点,你就快到了:

  • 您必须将 "sumo" 搜索模式更改为小写以匹配上面给出的数据
  • 然后您需要在循环体中添加如下内容

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

这是 XPath 的工作。简单检查 attribute matches and substring matches 然后我们 return 作为字符串的属性。

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)