0

XML ドキュメントから効率的にデータを取得するための解析アルゴリズムを作成しようとしています。現在、要素と子に基づいてドキュメントを読み進めていますが、代わりに iterparse を使用したいと考えています。1 つの問題は、見つかったときに子データをプルしたい要素のリストがあることですが、iterparse を使用すると、1 つの要素名に基づいてフィルター処理するか、すべての要素を取得するオプションがあるようです。

XML の例:

<?xml version="1.0" encoding="UTF-8"?>
<data_object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <source id="0">
  <name>Office Issues</name>
  <datetime>2012-01-13T16:09:15</datetime>
  <data_id>7</data_id>
 </source>
 <event id="125">
  <date>2012-11-06</date>
  <state_id>7</state_id>
 </event>
 <state id="7">
  <name>Washington</name>
 </state>
 <locality id="2">
  <name>Olympia</name>
  <state_id>7</state_id>
  <type>City</type>
 </locality>
 <locality id="3">
  <name>Town</name>
  <state_id>7</state_id>
  <type>Town</type>
 </locality>
</data_object>

コード例:

from lxml import etree

fname = "test.xml"
ELEMENT_LIST = ["source", "event", "state", "locality"]

with open(fname) as xml_doc:
    context = etree.iterparse(xml_doc, events=("start", "end"))

    context = iter(context)

    event, root = context.next()

    base = False
    b_name = ""

    for event, elem in context:
        if event == "start" and elem.tag in ELEMENT_LIST:
            base = True
            bname = elem.tag
            children = elem.getchildren()
            child_list = []
            for child in children:
                child_list.append(child.tag)
            print bname + ":" + str(child_list)
        elif event == "end" and elem.tag in ELEMENT_LIST:
            base = False
            root.clear()
4

3 に答える 3

1

iterparse解析を一部のタイプのタグに制限できないため、(引数を渡すことにより) 1 つのタグでのみこれを行うことができますtag。ただし、達成したいことを手動で行うのは簡単です。次のスニペットでは:

from lxml import etree

fname = "test.xml"
ELEMENT_LIST = ["source", "event", "state", "locality"]

with open(fname) as xml_doc:
    context = etree.iterparse(xml_doc, events=("start", "end"))

    for event, elem in context:
        if event == "start" and elem.tag in ELEMENT_LIST:
            print "this elem is interesting, do some processing: %s: [%s]" % (elem.tag, ", ".join(child.tag for child in elem))
        elem.clear()

検索を興味深いタグのみに制限します。の重要な部分iterparseは、elem.clear()アイテムが廃止されたときにメモリをクリアすることです。そのため、メモリ効率が高くなります。http://lxml.de/parsing.html#modifying-the-treeを参照してください。

于 2012-05-07T19:28:00.577 に答える
0

使用するtag='{http://www.sitemaps.org/schemas/sitemap/0.9}url'

正解の同様の質問https://stackoverflow.com/a/7019273/1346222

#!/usr/bin/python
# coding: utf-8
""" Parsing xml file. Basic example """
from StringIO import StringIO
from lxml import etree
import urllib2

sitemap = urllib2.urlopen(
    'http://google.com/sitemap.xml',
    timeout=10
).read()


NS = {
    'x': 'http://www.sitemaps.org/schemas/sitemap/0.9',
    'x2': 'http://www.google.com/schemas/sitemap-mobile/1.0'
}


res = []

urls = etree.iterparse(StringIO(sitemap), tag='{http://www.sitemaps.org/schemas/sitemap/0.9}url')

for event, url in urls:
    t = []
    t = url.xpath('.//x:loc/text() | .//x:priority/text()', namespaces=NS)
    t.append(url.xpath('boolean(.//x2:mobile)', namespaces=NS))
    res.append(t)
于 2013-03-10T20:29:49.923 に答える
0

代わりにXPathを使用します。自分でドキュメントを歩くよりもはるかにエレガントで、確かに効率的だと思います。

于 2012-05-07T20:32:03.080 に答える