2009-11-09 196 views
26

我喜欢ElementTree分析xml的方式,特别是Xpath功能。我有一个来自应用程序嵌套标记的xml输出。python:xml.etree.ElementTree,删除“命名空间”

我想通过名称访问这个标签而不指定名称空间,这有可能吗? 比如:

root.findall("/molpro/job") 

代替:

root.findall("{http://www.molpro.net/schema/molpro2006}molpro/{http://www.molpro.net/schema/molpro2006}job") 
+1

我想添加一个注释,在我的示例中,命名空间是相同的,但在整个Xml文件中还有其他的变量命名空间。我只想关闭此功能,就像在xml.dom.minidom解析器中一样。 – pygabriel

回答

8

至少有lxml2,有可能在一定程度上减少这种开销:

root.findall("/n:molpro/n:job", 
      namespaces=dict(n="http://www.molpro.net/schema/molpro2006")) 
5

你可以写自己的函数来包装令人讨厌的位,例如:

def my_xpath(doc, ns, xp); 
    num = xp.count('/') 
    new_xp = xp.replace('/', '/{%s}') 
    ns_tup = (ns,) * num 
    doc.findall(new_xp % ns_tup) 

namespace = 'http://www.molpro.net/schema/molpro2006' 
my_xpath(root, namespace, '/molpro/job') 

我不承认,但至少你可以阅读你的xpath表达式。