2

我在这里看到了很多关于 lxml 解析的问题,虽然它们都非常有用,但有些问题是特定于被解析文件的结构的。

就我而言,我有一个如下所示的 xml:

<documents>
    <document>
        <id>123456</id>
        <element name="name">
            <value><![CDATA[john doe]]></value>
        </element>
        <element name="address">
            <value><![CDATA[no name street]]></value>
        </element>
    </document>
</documents>

实际的 xml 有更多的元素,但这只是为了举例说明。我的最终目的是将其中一些信息提取到 csv 中,以便得到以下结果:

id, name, address
123456,john doe,no name street

但是我的问题是解析文件以根据条件(如果父“元素”具有特定属性)获取“值”元素中的值。

因为我要解析的真实文件大约是 8gb,所以我认为最好使用 lxml 的 iterparse 来避免在内存中存储一​​棵大树。

这是我现在拥有的代码,如果“元素”的属性“名称”等于列表“属性”中指定的值,我在尝试检查下一个元素的文本时有点卡在最后:

from lxml import etree

attributes = ("name", "address")
context = etree.iterparse("test.xml", tag="document")

for event, element in context:
    for child in element:
        if child.attrib.get("name") in attributes:
            print child.getnext().text

谢谢你的帮助!

4

1 回答 1

2

它不是真正的“下一个”,而是后代,所以我认为你可以再做一个循环。如果value始终是唯一的子元素,您可以执行以下操作:

from lxml import etree

attributes = ("name", "address")
context = etree.iterparse("test.xml", tag="document")

for event, element in context:
    for child in element:
        if child.attrib.get("name") in attributes:
            print next(c for c in child).text
    element.clear() # clear the subtree from the memory

否则你可以for在 if 里面做一个完整的循环,有点像

if child.attrib.get("name") in attributes:
    for subchild in child:
        if subchild.tag == 'value':
            print subchild.text
于 2013-04-14T18:44:08.377 回答