2

PythonでElementTreeを使って以下のxmlを処理したいです。UserValue タイトルが THIRD で、その値が空白でない場合、すべてのインスタンス名を検索する必要があります。したがって、この例では、結果は大理石とマウスになります。

<?xml version="1.0" encoding="utf-8"?>
<Data>
    <Instance id="61" name="atom">
        <UserData id="30">
            <UserValue value="" title="FIRST"></UserValue>
            <UserValue value="" title="SECOND"></UserValue>
            <UserValue value="" title="THIRD"></UserValue>
            <UserValue value="watch" title="FOURTH"></UserValue>
        </UserData>
    </Instance>
    <Instance id="64" name="marble" ref="33">
        <UserData id="34">
            <UserValue value="" title="FIRST"></UserValue>
            <UserValue value="stuff" title="SECOND"></UserValue>
            <UserValue value="airplane" title="THIRD"></UserValue>
            <UserValue value="" title="FOURTH"></UserValue>
        </UserData>
    </Instance>
    <Instance id="65" name="rock">
        <UserData id="36">
            <UserValue value="" title="FIRST"></UserValue>
            <UserValue value="" title="SECOND"></UserValue>
            <UserValue value="" title="THIRD"></UserValue>
            <UserValue value="" title="FOURTH"></UserValue>
        </UserData>     
    </Instance>
    <Instance id="66" name="mouse">
        <UserData id="38">
            <UserValue value="" title="FIRST"></UserValue>
            <UserValue value="" title="SECOND"></UserValue>
            <UserValue value="rocket" title="THIRD"></UserValue>
            <UserValue value="" title="FOURTH"></UserValue>
        </UserData>     
    </Instance>
</Data>

これは私が思いついたpythonコードです。正常に動作し、大理石とマウスを返します。findall または finditer を使用して同じことを行う方法はありますか?

もう1つの懸念は、ElementTreeがxml全体を処理するためにメモリにロードしているように見えることです。これは、300MB近くある私の実際のxmlにとって問題になる可能性があります。

import xml.etree.ElementTree as xml

tree = xml.parse("example.xml")

for node in tree.iter('Instance'):

    name = node.get('name')

    for col in node.iter('UserValue'):
        title = col.attrib.get('title')
        value = col.attrib.get('value')

        if (title == "THIRD" and value != ""):
            print "     name =", name
4

1 に答える 1