![](/img/trans.png)
[英]checking and fixing values appended to a node with lxml.objectify in python
[英]Python Lxml (objectify): Checking whether a tag exists
我需要检查xml文件中是否存在某个标记。
例如,我想查看此代码段中是否存在该标记:
<main>
<elem1/>
<elem2>Hi</elem2>
<elem3/>
...
</main>
目前,我正在使用一个带有错误检查的丑陋黑客,如下所示:
try:
if root.elem1.tag:
foo = elem1
except AttributeError:
foo = "error finding elem1"
如果无法找到节点,我也想自定义字符串(即“无法找到-tagname-”)。
我必须检查一长串变量,我不想重复代码100次。
有什么建议?
编辑:
以下是实际xml文件的片段:
<main>
<asset name="Virtual Dvaered Unpresence">
<virtual/>
<presence>
<faction>Dvaered</faction>
<value>-1000.000000</value>
<range>0</range>
</presence>
</asset>
<asset name="Virtual Empire Small">
<virtual/>
<presence>
<faction>Empire</faction>
<value>100.000000</value>
<range>2</range>
</presence>
</asset>
</main>
我想检查标签是否存在,如果是,则获取内容。
编辑编辑:好的,我将结合两个答案,但我只能投一票。 抱歉。
编辑3:关于XPath的相关问题: Python lxml(objectify):Xpath麻烦
hasattr()
适用于此:
if hasattr(root, 'elem1'):
foo = root.elem1
编辑 :样本文件的更新答案。
我假设你想搜索每个资产的某些标签。 如果是这样,以下内容对我有用:
import lxml.objectify
# Parse the file.
tree = lxml.objectify.parse('sample.xml')
root = tree.getroot()
# Which elements to find.
to_find = set(['presence/faction', 'presence/value', 'fake'])
# Go through each asset in the document.
for asset in root.findall('asset'):
# Check for each element.
for name in to_find:
node = asset.find(name)
if node is not None:
print 'Found %s, its value is %s' % (name, node)
else:
print 'Unable to find %s' % name
输出是:
Found presence/value, its value is -1000.0
Found presence/faction, its value is Dvaered
Unable to find fake
Found presence/value, its value is 100.0
Found presence/faction, its value is Empire
Unable to find fake
假设您想获得elem2的值,您可以使用xpath来查找它。
tree = etree.parse(StringIO(htmlString), etree.HTMLParser()).getroot()
youWantValue = tree.xpath('/main/elem2')[0].text
如果您的文档往往相对较短,您可以遍历<main>
所有子项,查找与您的变量名称集匹配的标记:
tree = lxml.etree.fromstring(DATA)
NAMES = set(['elem1', 'elem3'])
for node in tree.iterchildren():
if node.tag in NAMES:
print 'found', node.tag
或者,您可以一次搜索一个变量名称:
for tag in ('elem1', 'elem3'):
if tree.find(tag) is not None:
print 'found', tag
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.