滴在LXML所有命名空间? [英] Drop all namespaces in lxml?
问题描述
我与一些谷歌的数据API的工作,使用Python中lxml的图书馆。命名空间是这里巨大的麻烦。对于很多的工作我做(XPath的东西,主要是),这将是很好,只是简单的忽略它们。
I'm working with some of google's data APIs, using the lxml library in python. Namespaces are a huge hassle here. For a lot of the work I'm doing (xpath stuff, mainly), it would be nice to just plain ignore them.
有一个简单的办法忽略在Python / LXML XML命名空间?
Is there a simple way to ignore xml namespaces in python/lxml?
谢谢!
推荐答案
如果您想从元素和属性删除所有命名空间,我建议如下所示的code。
If you'd like to remove all namespaces from elements and attributes, I suggest the code shown below.
背景:在我的应用程序,我获得SOAP响应流的XML重新presentations,但我没有兴趣构建在客户端对象;我只对XML重新presentations自己感兴趣。此外,我不感兴趣的任何命名空间的事情,这只会使事情复杂得多,他们需要的是,我的目的。所以,我干脆删除元素的命名空间和我滴含有命名空间的所有属性。
Context: In my application I'm obtaining XML representations of SOAP response streams, but I'm not interested on building objects on the client side; I'm only interested on XML representations themselves. Moreover, I'm not interested on any namespace thing, which only makes things more complicated than they need to be, for my purposes. So, I simply remove namespaces from elements and I drop all attributes which contain namespaces.
def dropns(root):
for elem in root.iter():
parts = elem.tag.split(':')
if len(parts) > 1:
elem.tag = parts[-1]
entries = []
for attrib in elem.attrib:
if attrib.find(':') > -1:
entries.append(attrib)
for entry in entries:
del elem.attrib[entry]
# Test case
name = '~/tmp/mantisbt/test.xml'
f = open(name, 'rb')
import lxml.etree as etree
parser = etree.XMLParser(ns_clean=True, recover=True)
root = etree.parse(f, parser=parser)
print('=====================================================================')
print etree.tostring(root, pretty_print = True)
print('=====================================================================')
dropns(root)
print etree.tostring(root, pretty_print = True)
print('=====================================================================')
它打印:
=====================================================================
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:mc_issue_getResponse>
<return xsi:type="tns:IssueData">
<id xsi:type="xsd:integer">356</id>
<view_state xsi:type="tns:ObjectRef">
<id xsi:type="xsd:integer">10</id>
<name xsi:type="xsd:string">public</name>
</view_state>
</return>
</ns1:mc_issue_getResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
=====================================================================
<Envelope>
<Body>
<mc_issue_getResponse>
<return>
<id>356</id>
<view_state>
<id>10</id>
<name>public</name>
</view_state>
</return>
</mc_issue_getResponse>
</Body>
</Envelope>
=====================================================================
这篇关于滴在LXML所有命名空间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!