经过一些工作,我自己找到了答案。查看ElementTree.py源代码,我发现对XML注释和预处理指令进行了特殊处理。他们要做的是为特殊元素类型创建工厂函数,该函数使用特殊(非字符串)标记值将其与常规元素区分开。
def Comment(text=None): element = Element(Comment) element.text = text return element
然后,在
_write实际输出XML的ElementTree函数中,有一种特殊情况的注释处理:
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 etreedef CDATA(text=None): element = etree.Element(CDATA) element.text = text return elementclass ElementTreeCDATA(etree.ElementTree): def _write(self, file, node, encoding, namespaces): if node.tag is Cdata: text = node.text.enpre(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")


