我发现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/

10-11 21:35