pythonlxml(objectify):检查标记是否存在
我需要检查xml文件中是否存在某个标记 例如,我想查看此代码段中是否存在标记:pythonlxml(objectify):检查标记是否存在,python,xml,lxml,objectify,Python,Xml,Lxml,Objectify,我需要检查xml文件中是否存在某个标记 例如,我想查看此代码段中是否存在标记: <main> <elem1/> <elem2>Hi</elem2> <elem3/> ... </main> 如果字符串找不到节点(即“找不到-标记名-”),我还想自定义该字符串 我必须检查一长串变量,我不想把代码重复100次 有什么建议吗 编辑: 下面是实际xml文件的一个片段: &
<main>
<elem1/>
<elem2>Hi</elem2>
<elem3/>
...
</main>
如果字符串找不到节点(即“找不到-标记名-”),我还想自定义该字符串
我必须检查一长串变量,我不想把代码重复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>
如果您的文档比较短,您可以遍历
的所有子项,查找与您的变量名集匹配的标记:
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
编辑:更新样本文件的答案
我假设您要在每个资产中搜索特定的标记。如果是这样,以下几点对我有效:
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
hasattr()
适用于以下情况:
if hasattr(root, 'elem1'):
foo = root.elem1
我正在处理的文档很长。我将在这个问题中略作说明。另外,第一行是否建立了搜索的边界?这看起来将非常有效。有机会我会试试的。为了澄清一下,您是否使用set()和列表作为参数?是的。构造函数使用iterable来给出集合中的初始项。有关详细信息,请参阅。好的,一个问题。我如何才能让它为特定变量赋值(即var_fac=presence/section,var_value=presence/value?我会使用字典。如果节点不是None:values[name]=节点
等。哦,我明白了,将值存储在一个dict中。我喜欢这个想法。如果节点不存在,会发生什么?它会给出一个错误,还是仅仅是一个空白值?@Biosci3c该特定示例给出了一个错误,因为[0]
尝试取消引用xpath
调用返回的第一个值。另一方面,如果在取消引用之前检查列表是否为空,则会进行一次测试,没有错误。进行了更正后,顺便说一句,我发现这是给出的最佳实践答案。好的,我喜欢xpath建议,因此我将使用它也是。顺便说一句,我想你在顶行末尾缺少了一个右括号。啊,这样我就可以检查列表的长度是否为0。好主意。好吧,我尝试了你的方法的一个版本,但列表索引超出了范围。我将在上面发布我的更新代码。这是我喜欢的答案。它仍然很难看,但这是Python的错误,而不是海报的错误。我只是希望检查子级是否存在,而不是启动一个完整的xpath处理器。请注意,内部hasattr通过调用getattr并捕获异常来工作,因此它的内部和外部一样难看(至少是我上次检查时):)
if hasattr(root, 'elem1'):
foo = root.elem1