2016-10-30 11 views
0

カラーフォーマットに関する基本情報を格納するColorFormatクラスがあります。その目的は、XMLとの間でシリアライズおよびデシリアライズを行うことです。赤、緑、青、私は特別な色の文字列識別子を使用して表現するために:「#RGB」のような形式の場合XmlSerializerでのカスタムXML特殊文字の作成と使用

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

を、クラスのフォーマット文字列は、次のような次のとおりです。

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を使用することができます

+0

「CDATA」[CDATAセクション](https://msdn.microsoft.com/en-us/library/ms256076(v = vs.110).aspx) – Fabio

+2

XML '#&red; &green; &blue; 'は無効です。例えば。 http://www.xmlvalidation.com/にアップロードするとエラーが発生します*** XMLドキュメントのエラー:** 1:エンティティ "red"は参照されましたが、宣言されていません* – dbc

+0

'&text; ' - xml [entity](https://en.wikipedia.org/wiki/Document_type_definition#Entity_declarations)です。そのような実体を使用しないでください。 '&'の代わりに他のシンボルを使用してください。 –

答えて

0

最後にそれを見つけたColorFormatクラスの使用の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; 
     } 
    } 
} 

でラップウィットカラー値をシリアル化され、お奨めのような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); 
    } 
} 
1

思っていました。 MSDN以下の例クラスのCDATA Section

から

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()); 
} 
+0

デシリアライズ時にフォーマットがnullです。 –

+0

@HishamMaudarbocus、 'SerializableFormat'を' XmlNode [] 'タイプに変更し、' XmlAnyElement'属性を 'XmlText'に変更しました。 – Fabio

+0

ええ、魔法のように動作します。しかし、それは素晴らしい答えですが、それについてあまり満足していません。 CDATAは、通常のPCユーザーによって手動で編集されるので、ファイルに複雑すぎます。私はXMLでカスタムエンティティのリードを見てきましたが、もう少し探検する必要があります –