如何使用python搜索具有两个不同条件的XML树?

如何使用python搜索具有两个不同条件的XML树?,python,lxml,Python,Lxml,在过去的几个小时里,我一直在解决这个问题 这就是XML的样子 <xmlblock> <data1> <username>someusername</username> <id>12345</id> </data1> <data2> <username>u

在过去的几个小时里,我一直在解决这个问题

这就是XML的样子

    <xmlblock>
        <data1>
              <username>someusername</username>
              <id>12345</id>
        </data1>
        <data2>
             <username>username</username>
             <id>11111</id>
        </data1>
    </xmlblock>

someusername
12345
用户名
11111
问题是:

当用户名与给定id匹配时,我需要用户名

我不知道如何使用iterfind或python中的任何其他lxml模块进行双重搜索

任何帮助都将不胜感激。谢谢

A(可能不是最好的)解决方案

如果您同意使用以下工具,则应该可以使用

from xml.dom import minidom
doc = minidom.parseString('<xmlblock><data1><username>someusername</username><id>12345</id></data1><data2><username>username</username><id>11111</id></data2></xmlblock>')
username = [elem.parentNode.getElementsByTagName('username') for elem in doc.getElementsByTagName('id') if elem.firstChild.data == '12345'][0][0].firstChild.data
print username
从xml.dom导入minidom
doc=minidom.parseString('someusername12345username11111')
username=[elem.parentNode.getElementsByTagName('username')用于doc.getElementsByTagName('id')中的元素,如果elem.firstChild.data=='12345'][0][0]。firstChild.data
打印用户名
下面是一个使用和的示例


>xml=''
someusername
12345
用户名
11111
'''
>>>doc=lxml.etree.fromstring(xml)
>>>匹配的_节点=doc.xpath('//id[text()=“11111”]/../username')
>>>对于匹配_节点中的节点:
打印node.text
用户名

您能展示一下到目前为止您尝试了什么吗?嘿,谢谢,这段代码很有用。但是,我发现XML文件的这个标记并不一致。不确定如何动态查找父级项。用户名和id标记是否一致?然后我可以用一些没有数据的东西来更新我的答案。嗨,事实上它们并不一致。在某些XMLs中,用户名可以是相反的。因此,通过这个查询,它会出错。如何反转?你先有id然后是用户名?
from xml.dom import minidom
doc = minidom.parseString('<xmlblock><data1><username>someusername</username><id>12345</id></data1><data2><username>username</username><id>11111</id></data2></xmlblock>')
username = [elem.parentNode.getElementsByTagName('username') for elem in doc.getElementsByTagName('id') if elem.firstChild.data == '12345'][0][0].firstChild.data
print username
>>> xml = '''
    <xmlblock>
        <data1>
              <username>someusername</username>
              <id>12345</id>
        </data1>
        <data2>
             <username>username</username>
             <id>11111</id>
        </data2>
    </xmlblock>'''
>>> doc = lxml.etree.fromstring(xml)
>>> matching_nodes = doc.xpath('//id[text()="11111"]/../username')
>>> for node in matching_nodes:
        print node.text
username