0

過去数時間、この問題に悩まされています。

これはXMLがどのように見えるかです

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

問題はこれです:

特定のIDと一致する場合、ユーザー名が必要です。

Python で iterfind またはその他の lxml モジュールを使用して二重検索を行う方法がわかりません。

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

2

(おそらく最善ではない) 解決策

>>> id_to_match = 12345
>>> for event, element in cElementTree.iterparse('xmlfile.xml'):
...     if 'data' in element.tag:
...        for data in element:
...            if data.tag == 'username':
...                username = data.text
...            if data.tag == 'id':
...                if data.text == id_to_match:
...                    print username
someusername                 
于 2012-04-27T14:39:42.280 に答える
0

lxmlxpathを使用した例を次に示します。


>>> 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
于 2012-04-27T16:18:47.227 に答える
0

minidomを使用しても問題ない場合は、次のように動作するはずです

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
于 2012-04-27T15:27:48.903 に答える