簡體   English   中英

使用XmlSerializer創建和使用自定義XML特殊字符

[英]Creating and using custom XML special characters with XmlSerializer

我有一個ColorFormat類,用於存儲有關顏色格式的基本信息。 目的是能夠對XML進行序列化和反序列化。 為了表示紅色,綠色和藍色,我使用特殊的顏色字符串標識符:

public const string RedColorIdentifier = "&red;";
public const string GreenColorIdentifier = "&green;";
public const string BlueColorIdentifier = "&blue;";

對於“ #RGB”之類的格式,類格式字符串如下:

colorFormat.Format = "#" + ColorFormat.RedColorIdentifier +
                           ColorFormat.GreenColorIdentifier +
                           ColorFormat.BlueColorIdentifier;

理想情況下,序列化的XML應該是:

<ColorFormat Name="HexFmt" ColorBase="Hex">#&red;&green;&blue;</ColorFormat>

實際的序列化為:

<ColorFormat Name="HexFmt" ColorBase="Hex">#&amp;red;&amp;green;&amp;blue;</ColorFormat>

我想知道是否存在一種“序列化和反序列化”您自己的自定義特殊XML字符的方法

您可以使用CData來包裝特殊字符。
從MSDN CDATA部分

例如下面的類將是序列化的witt顏色值,並用CData包裝

[XmlType("ColorFormat")]
public class ColorFormat
{
    [XmlAttribute]
    public string Name { get; set; }

    [XmlAttribute]
    public string ColorBase { get; set; }

    [XmlIgnore]
    public string Format { get; set; }

    [XmlText]
    public XmlNode[] SerializableFormat
    {
        get
        {
            var doc = new XmlDocument();
            return new XmlNode[] { doc.CreateCDataSection(this.Format) };
        }
        set
        {
            this.Format = value[0].Value;
        }
    }
}

使用ColorFormat

const string FORMAT = "&red;&green;&blue;";

var format = new ColorFormat
{
    Name = "HexFormat",
    ColorBase = "Hex",
    Format = FORMAT
};

var serializer = new XmlSerializer(typeof(ColorFormat));
using (var writer = new StringWriter())
{
    serializer.Serialize(writer, format);
    Console.WriteLine(writer.ToString());
}

終於找到了,必須像這樣實現IXmlSerializable:

public class ColorFormat : IXmlSerializable
{
    ...

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        Name = reader.GetAttribute(nameof(Name));
        ColorBase = CommonUtil.ParseStringToEnum<NumberBase>(reader.GetAttribute(nameof(ColorBase)));
        Format = reader.ReadInnerXml();
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteAttributeString(nameof(Name), Name);
        writer.WriteAttributeString(nameof(ColorBase), ColorBase.ToString());
        writer.WriteRaw(Format);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM