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