gpt4 book ai didi

python - 可以在此 python ElementTree 示例中使用 findall 或 finditer 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 01:26:22 26 4
gpt4 key购买 nike

我想在 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 来做同样的事情?

另一个问题是 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

最佳答案

我推荐你使用lxml .您可以将 xpath 表达式与 lxml 结合使用。

import lxml.etree

root = lxml.etree.parse("example.xml")
for instance in root.xpath('//Instance[descendant::UserValue[@title = "THIRD"][@value != ""]]'):
print instance.get('name')

如果上面的代码占用太多内存尝试下面的代码:

import lxml.etree

class InstanceNamePrinter(object):
def start(self, tag, attrib):
if tag == 'Instance':
self.name = attrib['name']
elif tag == 'UserValue':
if attrib['title'] == 'THIRD' and attrib['value'] != '':
print self.name
def close(self):
pass

with open('example.xml') as xml:
parser = lxml.etree.XMLParser(target=InstanceNamePrinter())
lxml.etree.parse(xml, parser)

关于python - 可以在此 python ElementTree 示例中使用 findall 或 finditer 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17619123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com