Sweets Junkie

もぅマヂ無理。ムズかしぃコト。。。ぉぼぇてらんなぃから。。。ブログかコ。。。デザィンみづらくてぇ。。。それどころじゃなぃ。。。

【C#】CDATAセクションを付けたり付けなかったりする

XmlSerializerでオブジェクトをシリアライズする際に、あるメンバーにCDATAセクションを付けたい場合は以下のような実装をすると思う。

public class Program
{
    public static void Main(string[] args)
    {
        // 保存先
        String file = @"C:\tmp\sample.xml";

        // シリアイズするオブジェクト
        User user = new User();
        user.Name = "中村悠一";
        user.Comment = new XmlDocument().CreateCDataSection("めっちゃオシャレな家、めっちゃオシャレな家できた");

        XmlSerializer serializer = new XmlSerializer(typeof(User));
        using (FileStream fs = new FileStream(file, FileMode.Create))
        {
            //シリアライズ
            serializer.Serialize(fs, user);
        }
    }
    public class User
    {
        public String Name { get; set; }
        // CDATAセクションで囲むメンバー
        public XmlCDataSection Comment { get; set; }
    }
}


上記を実行すると以下のようなXMLファイルができる。

<?xml version="1.0"?>
<User xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>中村悠一</Name>
  <Comment><![CDATA[めっちゃオシャレな家、めっちゃオシャレな家できた]]></Comment>
</User>


ここでUser.Commentに入れる値が空文字の場合にのみCDATAセクションを付けないなどの制御をおこなう場合は、XmlCDataSectionは使用せずにXmlNodeを使用する。
Commentに値を設定する際に値をチェックして、空文字でなければCDATAセクションとして設定し、そうでない場合は空文字をする。

public class Program
{
    public static void Main(string[] args)
    {
        // 保存先
        String file = @"C:\tmp\sample.xml";

        // シリアイズするオブジェクト
        User user = new User();
        user.Name = "中村悠一";
        user.SetComment("");

        XmlSerializer serializer = new XmlSerializer(typeof(User));
        using (FileStream fs = new FileStream(file, FileMode.Create))
        {
            //シリアライズ
            serializer.Serialize(fs, user);
        }
    }
    public class User
    {
        public String Name { get; set; }
        // CDATAセクションで囲むメンバー
        public XmlNode Comment { get; set; }

        // setter
        public void SetComment(String comment)
        {
            // Null or 空文字の場合はCDATAセクションを付けない。
            if (String.IsNullOrEmpty(comment))
            {
                this.Comment = new XmlDocument().CreateWhitespace("");
            }
            else
            {
                this.Comment = new XmlDocument().CreateCDataSection(comment);
            }
        }
    }
}


実行結果。

<?xml version="1.0"?>
<User xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>中村悠一</Name>
  <Comment></Comment>
</User>


こんな感じ!以上!