我在我的项目中使用XmlTextWriter
类。我不知道,如何在Xml中使用CDATA。任何人都可以帮助我吗?
objX.WriteElementString("category", c.DeepestCategoryName);
答案 0 :(得分:6)
如其他人所述,如果您想明确写一个CDATA部分,请使用WriteCData
。这是一个通用的扩展方法,我用它来“自动”写一个CDATA元素,如果文本包含某些字符:
public static void WriteElementContent(this XmlWriter writer, string content)
{
if (String.IsNullOrEmpty(content))
{
return;
}
// WriteString will happily escape any XML markup characters. However,
// for legibility we write content that contains certain special
// characters as CDATA
const string SpecialChars = @"<>&";
if (content.IndexOfAny(SpecialChars.ToCharArray()) != -1)
{
writer.WriteCData(content);
}
else
{
writer.WriteString(content);
}
}
答案 1 :(得分:2)
你不需要。
XmlTextWriter
会自动转义您的文字。
当手动编写XML以避免转义字符时,CDATA部分非常有用 由于XmlTextWriter将为您转义字符,因此制作CDATA部分毫无意义。
如果您真的想要,可以拨打WriteCData
method。
答案 2 :(得分:2)
希望这有助于某人,它帮助了我。
我 使用明确预期CDATA部分的XML Web服务。我想使用XmlSerializer
对对象进行序列化,并且不想每次都需要手动执行WriteCData()
。
使用Rich Tebb的WriteContentElement
代码(感谢您!),我将XmlTextWriter
和WriteString(string text)
包含在内,如下所示:
public class MyXmlTextWriter : XmlTextWriter
{
public MyXmlTextWriter(TextWriter textWriter) : base(textWriter) { }
public MyXmlTextWriter(Stream stream, Encoding encoding) : base(stream, encoding) { }
public MyXmlTextWriter(string filename, Encoding encoding) : base(filename, encoding) { }
public override void WriteString(string text)
{
if (String.IsNullOrEmpty(text))
{
return;
}
// WriteString will happily escape any XML markup characters. However,
// for legibility we write content that contains certain special
// characters as CDATA
const string SpecialChars = @"<>&";
if (text.IndexOfAny(SpecialChars.ToCharArray()) != -1)
{
WriteCData(text);
}
else
{
base.WriteString(text);
}
}
}
使用以下代码,任何带有“特殊字符”的字符串现在都将呈现为CDATA部分而不是编码:
using (MemoryStream memoryStream = new MemoryStream())
{
using (var xmlWriter = new MyXmlTextWriter(memoryStream, new UTF8Encoding(false)))
{
serializer.Serialize(xmlWriter, value);
}
return Encoding.UTF8.GetString(memoryStream.ToArray());
}
附注:我正在使用MemoryStream
和UTF8Encoding(false)
来获取没有BOM的UTF-8编码字符串,并将XML标记呈现为<?xml version="1.0" encoding="utf-8"?>
。
答案 3 :(得分:0)
如果您想要明确的<![CDATA[]]>
部分,请使用WriteCData
。
答案 4 :(得分:0)
// Write CData block
xmlWriter.WriteCData("<br>");
http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.writecdata.aspx
答案 5 :(得分:0)
using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
public static class XsdObjectSerializer {
#region Public Methods
public static String ToXsdSerializedXmlDocument<T>(this T t) {
using (var customUtf8TextWriter = new CustomUtf8StringWriter()) {
using (var customXmlTextWriter = new CustomXmlTextWriter(customUtf8TextWriter)) {
customXmlTextWriter.Formatting = Formatting.Indented;
new XmlSerializer(typeof(T)).Serialize(customXmlTextWriter, t);
}
var xsdSerializedXmlDocument = customUtf8TextWriter.ToString();
return xsdSerializedXmlDocument;
}
}
#endregion
#region Private Classes
private class CustomUtf8StringWriter : StringWriter {
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
private class CustomXmlTextWriter : XmlTextWriter {
public CustomXmlTextWriter(TextWriter textWriter) : base(textWriter) { }
public CustomXmlTextWriter(Stream stream, Encoding encoding) : base(stream, encoding) { }
public CustomXmlTextWriter(string filename, Encoding encoding) : base(filename, encoding) { }
public override void WriteString(string text) {
if (String.IsNullOrEmpty(text))
return;
const string SpecialChars = @"<>&";
if (text.IndexOfAny(SpecialChars.ToCharArray()) != -1) {
WriteCData(text);
} else {
base.WriteString(text);
}
}
}
#endregion
}