Azureはじめました

Windows Azureで業務システムを組んでみる日記

anyElementを何とかしたい

xmlスキーマからバインド用のクラスを作ってデシリアライズ の続き

よく考えたらAnyに入るべきクラスってそんなに多くない

ということで、Anyとなるエレメントの他に対象のコンテンツが格納されるプロパティを作ってみた

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlRootAttribute("ROOT", Namespace = "hoge", IsNullable = false)]
public class ROOT{
 
	[System.Xml.Serialization.XmlAnyElementAttribute()]
	public System.Xml.XmlElement[] any {get;set;}


	[System.Xml.Serialization.XmlElement(Namespace="hoge",ElementName="BRANCH1")]
	public Branch1 branch1 { get; set; }

	[System.Xml.Serialization.XmlElement(Namespace="hoge",ElementName="BRANCH2")]
	public Branch2 branch2 { get; set; }
}
  • 対象データが無ければany/branch1/branch2ともにnullに
  • 対象のタグがあればそれぞれbranch1/branch2にインスタンス
  • branch1/branch2以外のタグはまとめてanyに

という形で多少使いづらさは残るけど何とかなった。

本当は

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlRootAttribute("ROOT", Namespace = "hoge", IsNullable = false)]
public class ROOT{
 

	public List<Branch> any { get; set; }
}


[System.Xml.Serialization.XmlElement(Namespace="hoge",ElementName="BRANCH")]
public class Branch{ }

[System.Xml.Serialization.XmlElement(Namespace="hoge",ElementName="BRANCH1")]
public class Branch1 : Branch{ }

[System.Xml.Serialization.XmlElement(Namespace="hoge",ElementName="BRANCH2")]
public class Branch2 : Branch{ }

みたいな形にできればよかったんだけど。