如何使用XmlTextWriter生成CDATA?

时间:2010-12-28 14:27:13

标签: c# .net xml

我在我的项目中使用XmlTextWriter类。我不知道,如何在Xml中使用CDATA。任何人都可以帮助我吗?

objX.WriteElementString("category", c.DeepestCategoryName);

6 个答案:

答案 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代码(感谢您!),我将XmlTextWriterWriteString(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());
}

附注:我正在使用MemoryStreamUTF8Encoding(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
}