python - 删除 lxml 中的所有命名空间?

标签 python xml api lxml

我正在使用 python 中的 lxml 库处理一些谷歌的数据 API。命名空间在这里是一个巨大的麻烦。对于我正在做的很多工作(主要是 xpath 的东西),直接忽略它们会很好。

有没有一种简单的方法可以忽略 python/lxml 中的 xml 命名空间?

谢谢!

最佳答案

如果您想从元素和属性中删除所有命名空间,我建议使用下面显示的代码。

上下文:在我的应用程序中,我正在获取 SOAP 响应流的 XML 表示,但我对在客户端构建对象不感兴趣;我只对 XML 表示本身感兴趣。此外,我对任何命名空间的事情都不感兴趣,这只会让事情变得比我需要的更复杂,就我的目的而言。因此,我只是从元素中删除 namespace ,并删除所有包含 namespace 的属性。

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>
=====================================================================

关于python - 删除 lxml 中的所有命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9316095/

相关文章:

python - 奇怪的行为 : pcolormesh and meshgrid (easy)

python - 神经网络 sigmoid 函数

golang 中的 xml 解析(我想单独访问详细信息中的每个元素)

Java:在另一个类中访问 XML 值作为新变量

api - 我可以在商业项目中使用 Google Weather API 吗?

javascript - 如何延迟pdf扫描直到页面完全加载php中的pdfcrowd api?

python - 如何防止 python urllib3 缓存响应

python - Python 中 compile() 的可逆版本

java - 用于 XML 编程的 API

c# - Azure Web API 访问 : Which URL should I use, Web 服务 URL 或网关 URL?