【问题标题】:Stripping python namespace attributes from an lxml.objectify.ObjectifiedElement [duplicate]从 lxml.objectify.ObjectifiedElement 中剥离 python 命名空间属性
【发布时间】:2011-09-02 17:51:14
【问题描述】:

可能重复:
When using lxml, can the XML be rendered without namespace attributes?

如何从lxml.objectify.ObjectifiedElement 中去除 python 属性?

示例:

In [1]: from lxml import etree, objectify
In [2]: foo = objectify.Element("foo")
In [3]: foo.bar = "hi"
In [4]: foo.baz = 1
In [5]: foo.fritz = None
In [6]: print etree.tostring(foo, pretty_print=True)
<foo xmlns:py="http://codespeak.net/lxml/objectify/pytype" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" py:pytype="TREE">
  <bar py:pytype="str">hi</bar>
  <baz py:pytype="int">1</baz>
  <fritz xsi:nil="true"/>
</foo>

我希望输出看起来像:

<foo>
  <bar>hi</bar>
  <baz>1</baz>
  <fritz/>
</foo>

【问题讨论】:

    标签: python formatting lxml objectify elementtree


    【解决方案1】:

    还有专门的函数objectify.deannotate(...):

    Help on built-in function deannotate in module lxml.objectify:
    
          deannotate(...)
            deannotate(element_or_tree, pytype=True, xsi=True, xsi_nil=False, cleanup_namespaces=False)
    
            Recursively de-annotate the elements of an XML tree by removing 'py:pytype'
            and/or 'xsi:type' attributes and/or 'xsi:nil' attributes.
    
            If the 'pytype' keyword argument is True (the default), 'py:pytype'
            attributes will be removed. If the 'xsi' keyword argument is True (the
            default), 'xsi:type' attributes will be removed.
            If the 'xsi_nil' keyword argument is True (default: False), 'xsi:nil'
            attributes will be removed.
    
            Note that this does not touch the namespace declarations by
            default.  If you want to remove unused namespace declarations from
            the tree, pass the option ``cleanup_namespaces=True``.
    

    【讨论】:

      【解决方案2】:

      您可以通过使用etree.strip_attributesetree.cleanup_namespaces 来完成此操作。

      In [8]: etree.strip_attributes(foo, '{http://codespeak.net/lxml/objectify/pytype}pytype')
      In [9]: print etree.tostring(foo, pretty_print=True)
      <foo xmlns:py="http://codespeak.net/lxml/objectify/pytype" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <bar>hi</bar>
        <baz>1</baz>
        <fritz xsi:nil="true"/>
      </foo>
      
      In [10]: etree.cleanup_namespaces(foo)
      In [11]: print etree.tostring(foo, pretty_print=True)
      <foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <bar>hi</bar>
        <baz>1</baz>
        <fritz xsi:nil="true"/>
      </foo>
      

      这仍然留下xsi:nil 引用,您可以类似地剥离它。

      In [12]: etree.strip_attributes(foo, '{http://www.w3.org/2001/XMLSchema-instance}nil')
      In [13]: etree.cleanup_namespaces(foo)
      In [14]: print etree.tostring(foo, pretty_print=True)
      <foo>
        <bar>hi</bar>
        <baz>1</baz>
        <fritz/>
      </foo>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多