使用lxml、Java DOM和C# XmlDocument可生成带CDATA的XML,分别通过etree.CDATA、createCDATASection和CreateCDataSection方法实现,注意避免嵌套及编码问题。

在XML中,CDATA(Character Data)节点用于包裹文本内容,使其中的特殊字符(如 、& 等)无需进行实体转义。生成带有CDATA节点的XML,关键在于使用支持CDATA输出的XML生成工具或API。以下介绍几种常见方法及示例。
使用Python生成带CDATA的XML
Python的xml.etree.ElementTree默认不支持CDATA,但可以通过自定义序列化方式实现。推荐使用lxml库,它原生支持CDATA。
示例代码:
from lxml import etree创建根元素
root = etree.Element("message") content = etree.CDATA("这是一段包含特殊字符的内容:") root.append(etree.Element("content")) root.find("content").text = content
生成XML字符串
xml_str = etree.tostring(root, encoding="utf-8", pretty_print=True, xml_declaration=True) print(xml_str.decode())
输出结果:
使用Java生成带CDATA的XML
在Java中,可以使用javax.xml.parsers和org.w3c.dom.Document创建XML,并通过Document.createCDATASection()方法添加CDATA节点。
示例代码:
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.*;public class CreateCDataXML { public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument();
Element root = doc.createElement("article");
doc.appendChild(root);
Element body = doc.createElement("body");
String cdataContent = "这是HTML内容,包含标签
";
CDATASection cdata = doc.createCDATASection(cdataContent);
body.appendChild(cdata);
root.appendChild(body);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
}}
使用.NET(C#)生成带CDATA的XML
C#中的XmlDocument类提供CreateCDataSection方法来创建CDATA节点。
示例代码:
using System; using System.Xml;class Program { static void Main() { XmlDocument doc = new XmlDocument(); XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null); doc.AppendChild(decl);
XmlElement root = doc.CreateElement("data");
doc.AppendChild(root);
XmlElement desc = doc.CreateElement("description");
string cdataText = "这里可以写任意文本,比如 不被解析的内容 ";
XmlCDataSection cdata = doc.CreateCDataSection(cdataText);
desc.AppendChild(cdata);
root.AppendChild(desc);
doc.Save(Console.Out);
}}
注意事项与建议
生成带CDATA的XML时,注意以下几点:
- 并非所有XML库都原生支持CDATA输出,需确认所用工具是否具备该功能
- CDATA块不能嵌套,避免在内容中出现导致解析错误
- 只在确实需要保留格式或包含大量特殊字符时使用CDATA,避免滥用
- 确保输出编码一致,防止中文等字符乱码
基本上就这些常用方法,选择适合你开发语言的技术方案即可实现带CDATA节点的XML生成。










