在C#中创建CDATA节点须使用XCData类显式包装内容并作为XElement子节点添加,不能直接用字符串或赋值给Value属性;示例:new XElement("description", new XCData("Hello & World!"))。
在C#中用LINQ to XML创建带CDATA的节点,关键不是直接用XElement,而是要用XCData类显式包装内容,并作为子节点添加到目标元素中。
XCData是专门用于表示CDATA节的类型,它必须作为XElement的子节点存在,不能直接作为根或独立对象写入文档。常见错误是试图把字符串直接标记为CDATA,其实必须“包裹”进去。
XElement(比如)new XCData("你的HTML或特殊字符")构造CDATA内容XCData对象传给XElement的构造函数或用Add()方法添加下面这段代码生成一个包含CDATA的XML片段:
var doc = new XDocument(
new XElement("root",
new XElement("description",
new XCData("Hello & World!"))));
Console.WriteLine(doc.ToString());
输出结果会是:
Hello & World!]]>
注意:原始字符串中的和&不会被转义——这正是CDATA的作用。
.ToString()再塞进XElement——那只是普通文本,会被自动转义XElement.Value = new XCData(...)——Value只接受字符串,赋值会调用ToString()丢掉CDATA语义XElement,可用element.Add(new XCData("..."))追加,但注意CDATA会成为子节点;若想替换全部内容,先element.RemoveAll()再Add()
CDATA可以和普通子元素、属性共存:
varitem = new XElement("item", new XAttribute("id", "101"), new XElement("title", "Intro"), new XElement("body", new XCData("
First para
")));
这样生成的内就是纯CDATA,而id和title仍是标准XML结构。
基本上就这些。核心就一条:用XCData实例,别用字符串硬凑。