python - 如何使用 ElementTree 输出 CDATA

标签 python xml

我发现 cElementTree 比 xml.dom.minidom 快大约 30 倍,我正在重写我的 XML 编码/解码代码。但是,我需要输出包含 CDATA 部分的 XML,而 ElementTree 似乎没有办法做到这一点。

可以吗?

最佳答案

经过一番努力,我自己找到了答案。查看 ElementTree.py 源代码,我发现对 XML 注释和预处理指令进行了特殊处理。他们所做的是为特殊元素类型创建一个工厂函数,该函数使用特殊(非字符串)标记值将其与常规元素区分开来。

def Comment(text=None):
    element = Element(Comment)
    element.text = text
    return element

那么在实际输出XML的ElementTree的_write函数中,有一个对注释的特殊情况处理:

if tag is Comment:
    file.write("<!-- %s -->" % _escape_cdata(node.text, encoding))

为了支持 CDATA 部分,我创建了一个名为 CDATA 的工厂函数,扩展了 ElementTree 类并更改了 _write 函数来处理 CDATA 元素。

如果您想用 CDATA 部分解析 XML,然后用 CDATA 部分再次输出它,这仍然无济于事,但它至少允许您以编程方式创建带有 CDATA 部分的 XML,这是我需要做的.

该实现似乎适用于 ElementTree 和 cElementTree。

import elementtree.ElementTree as etree
#~ import cElementTree as etree

def CDATA(text=None):
    element = etree.Element(CDATA)
    element.text = text
    return element

class ElementTreeCDATA(etree.ElementTree):
    def _write(self, file, node, encoding, namespaces):
        if node.tag is CDATA:
            text = node.text.encode(encoding)
            file.write("\n<![CDATA[%s]]>\n" % text)
        else:
            etree.ElementTree._write(self, file, node, encoding, namespaces)

if __name__ == "__main__":
    import sys

    text = """
    <?xml version='1.0' encoding='utf-8'?>
    <text>
    This is just some sample text.
    </text>
    """

    e = etree.Element("data")
    cdata = CDATA(text)
    e.append(cdata)
    et = ElementTreeCDATA(e)
    et.write(sys.stdout, "utf-8")

关于python - 如何使用 ElementTree 输出 CDATA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/174890/

相关文章:

python - 进一步加快并行化进程

php - 以最简单、最整洁的方式一页可编辑列表

c# - 如何在 C# 中读取此 XML?

php - 与号 (&) 处的 XML 错误

python - 如何仅在测试失败时运行 fixture ?

Python:在单独的脚本中动态调用方法

python - python 中的 Zip 键值对

python - 如何检查列表元素是否存在于python中的数组中

python - 使用ElementTree的iterparse方法如何知道元素的父元素?

jquery - 使用 jQuery 在 ID 具有类时显示内容