python:xml.etree.ElementTree,删除;名称空间;

python:xml.etree.ElementTree,删除;名称空间;,python,xml,Python,Xml,我喜欢ElementTree解析xml的方式,特别是Xpath特性。我从带有嵌套标记的应用程序中获得了一个xml输出 我想按名称访问此标记,而不指定名称空间,可以吗? 例如: root.findall("/molpro/job") def my_xpath(doc, ns, xp); num = xp.count('/') new_xp = xp.replace('/', '/{%s}') ns_tup = (ns,) * num doc.findall(new

我喜欢ElementTree解析xml的方式,特别是Xpath特性。我从带有嵌套标记的应用程序中获得了一个xml输出

我想按名称访问此标记,而不指定名称空间,可以吗? 例如:

root.findall("/molpro/job")
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')
而不是:

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

至少使用lxml2,可以在一定程度上减少此开销:

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

您可以编写自己的函数来包装外观不好的部分,例如:

root.findall("/molpro/job")
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表达式。

我想补充一点,在我的示例中,名称空间是相同的,但在整个Xml文件中还有其他可变名称空间。我只想关闭这个特性,就像在xml.dom.minidom解析器中一样。