python';s-lxml和iterparse法

python';s-lxml和iterparse法,python,lxml,Python,Lxml,假设我有这个示例XML <result> <field k='field1'> <value h='1'><text>text_value1</text></value> </field> <field k='field2'> <value><text>text_value2</text></value&

假设我有这个示例XML

<result>
    <field k='field1'>
        <value h='1'><text>text_value1</text></value>
    </field>
    <field k='field2'>
        <value><text>text_value2</text></value>
    </field>
    <field k='field3'>
        <value><text>some_text</text></value>
    </field>
</result>
任何帮助都将不胜感激

编辑 这是我想出的代码。必须调用getparent()两次才能读取相应文本值的属性,这似乎有点笨拙。有更好的方法吗

for action, elem in context:
    list = elem.xpath('//text')
    print "result set:"
    for item in list:
        field = item.getparent().getparent().attrib['k']
        value = item.text
        print "\t%s = %s"%(field, value)
我建议使用一种新的方法。沿着
r=tree.xpath('//text')
的东西应该足以满足您的需要。

怎么样:

import io
import lxml.etree as ET

content='''\
<result>
    <field k='field1'>
        <value h='1'><text>text_value1</text></value>
    </field>
    <field k='field2'>
        <value><text>text_value2</text></value>
    </field>
    <field k='field3'>
        <value><text>some_text</text></value>
    </field>
</result>'''

contentBuffer=io.BytesIO(content)
context = ET.iterparse(contentBuffer,tag='result')
for action, elem in context:
    fields=elem.xpath('field/@k')
    values=elem.xpath('field/value/text/text()')
    for field,value in zip(fields,values):
        print('\t{f} = {v}'.format(f=field,v=value))

您希望工作脚本的输出是什么?我想打印字段名(在attr中)=值(文本)。我希望这些字段与该结果集中的其他字段一起分组。
import io
import lxml.etree as ET

content='''\
<result>
    <field k='field1'>
        <value h='1'><text>text_value1</text></value>
    </field>
    <field k='field2'>
        <value><text>text_value2</text></value>
    </field>
    <field k='field3'>
        <value><text>some_text</text></value>
    </field>
</result>'''

contentBuffer=io.BytesIO(content)
context = ET.iterparse(contentBuffer,tag='result')
for action, elem in context:
    fields=elem.xpath('field/@k')
    values=elem.xpath('field/value/text/text()')
    for field,value in zip(fields,values):
        print('\t{f} = {v}'.format(f=field,v=value))
field1 = text_value1
field2 = text_value2
field3 = some_text