【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>
こんな感じ!以上!