【发布时间】:2026-01-16 16:45:02
【问题描述】:
这是 Java 问题 How to output a CDATA section from a Sax XmlHandler 的 Python 等价物
xml.sax.saxutils.XMLGenerator 或 lxml.sax.ElementTreeContentHandler 均未提及 CDATA 部分。如何让它输出 CDATA?
【问题讨论】:
这是 Java 问题 How to output a CDATA section from a Sax XmlHandler 的 Python 等价物
xml.sax.saxutils.XMLGenerator 或 lxml.sax.ElementTreeContentHandler 均未提及 CDATA 部分。如何让它输出 CDATA?
【问题讨论】:
你可以使用 xml.dom.minidom 像这样:
doc = xml.dom.minidom.Document()
article = doc.createElement('article')
content = doc.createCDATASection('<p>Any CDATA</p>')
article.appendChild(content)
【讨论】:
Document.createCDATASection() 方法有效,但文档中缺少它:docs.python.org/3/library/xml.dom.html#document-objects。
你可以直接在你的代码中使用
from xml.sax.saxutils import XMLGenerator
xml = XMLGenerator()
xml.startDocument()
xml.startElement('item', {})
content = '<p>Stuff</p>'
cdata = '<![CDATA[{}]]>'.format(content)
xml.ignorableWhitespace(cdata)
xml.endElement('item')
xml.endDocument()
或者用一个新的函数扩展 XMLGenerator 类
from xml.sax.saxutils import XMLGenerator
class _XMLGenerator(XMLGenerator):
def cdata(self, content):
cdata = '<![CDATA[{}]]>'.format(content)
self.ignorableWhitespace(cdata)
xml = _XMLGenerator()
xml.startDocument()
xml.startElement('item', {})
content = '<p>Stuff</p>'
xml.cdata(content)
xml.endElement('item')
xml.endDocument()
我不使用xml.characters(content)的原因是因为它调用了xml.sax.saxutils.escape函数,而该函数又转义了&、。
【讨论】: