首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用lxml.objectify测试元素的存在性

用lxml.objectify测试元素的存在性
EN

Stack Overflow用户
提问于 2014-02-14 10:03:27
回答 2查看 5.1K关注 0票数 9

lxml.objectify 标准的方法是什么,用于测试是否存在一个元素,是否存在

示例XML :

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Test>
  <MyElement1>sdfsdfdsfd</MyElement1>
</Test>

代码语言:javascript
复制
from lxml import etree, objectify
with open('config.xml') as f:
    xml = f.read()
root = objectify.fromstring(xml)

print root.MyElement1
print root.MyElement17  # AttributeError: no such child: MyElement17

,那么,在特定路径上写东西的最简单的解决方案是什么?

代码语言:javascript
复制
root.MyElement1.Blah = 'New'  # this works because MyElement1 already exists
root.MyElement17.Blah = 'New'  # this doesn't work because MyElement17 doesn't exist
root.MyElement1.Foo.Bar = 'Hello' # this doesn't as well... How to do this shortly ?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-14 10:15:21

如果元素不存在,find方法将返回None

代码语言:javascript
复制
>>> xml = '''<?xml version="1.0" encoding="utf-8"?>
... <Test>
...   <MyElement1>sdfsdfdsfd</MyElement1>
... </Test>'''
>>>
>>> from lxml import objectify
>>> root = objectify.fromstring(xml)
>>> root.find('.//MyElement1')
'sdfsdfdsfd'
>>> root.find('.//MyElement17')
>>> root.find('.//MyElement17') is None
True

根据问题编辑更新

代码语言:javascript
复制
>>> from lxml import objectify
>>>
>>> def add_string(parent, attr, s):
...     if len(attr) == 1:
...         setattr(parent, attr[0], s)
...     else:
...         child = getattr(parent, attr[0], None)
...         if child is None:
...             child = objectify.SubElement(parent, attr[0])
...         add_string(child, attr[1:], s)
...
>>> root = objectify.fromstring(xml)
>>> add_string(root, ['MyElement1', 'Blah'], 'New')
>>> add_string(root, ['MyElement17', 'Blah'], 'New')
>>> add_string(root, ['MyElement1', 'Foo', 'Bar'], 'Hello')
>>>
>>> root.MyElement1.Blah
'New'
>>> root.MyElement17.Blah
'New'
>>> root.MyElement1.Foo.Bar
'Hello'
票数 7
EN

Stack Overflow用户

发布于 2014-02-14 10:15:12

您可以使用getattr

代码语言:javascript
复制
if getattr(root, 'MyElement17', None):
     # do something
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21776222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档