pythonlxml(objectify):检查标记是否存在

pythonlxml(objectify):检查标记是否存在,python,xml,lxml,objectify,Python,Xml,Lxml,Objectify,我需要检查xml文件中是否存在某个标记 例如,我想查看此代码段中是否存在标记: <main> <elem1/> <elem2>Hi</elem2> <elem3/> ... </main> 如果字符串找不到节点(即“找不到-标记名-”),我还想自定义该字符串 我必须检查一长串变量,我不想把代码重复100次 有什么建议吗 编辑: 下面是实际xml文件的一个片段: &

我需要检查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