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