【问题标题】:Drop all namespaces in lxml?删除 lxml 中的所有命名空间?
【发布时间】:2012-03-08 03:14:52
【问题描述】:

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

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

谢谢!

【问题讨论】:

标签: python xml api lxml


【解决方案1】:

在 lxml 中,some_element.tag 是一个类似 {namespace-uri}local-name 的字符串,如果有命名空间,则为 local-name 否则。注意它是非元素节点(如 cmets)上的非字符串值。

试试这个:

for node in some_tree.iter():
    startswith = getattr(node 'startswith', None)
    if startswith and startswith('{'):
        node.tag = node.tag.rsplit('}', 1)[-1]

在 Python 2.x 上,标签可以是 ASCII 字节字符串或 Unicode 字符串。 startwith 方法测试的存在。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-30
      • 2011-05-14
      • 2016-02-04
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多