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