2016-04-18 5 views
0

を使用して基本クラスから継承するクラスのノード名のXMLTypeの書き込みにどのように私はC#のオブジェクトのグループから次のXMLを生成したいと思いますこのまたはそのノードを含むことができ、私はXMLスキーマを制御できません。適切なXMLを記述するC#オブジェクトを作成する必要がありますが、物語コレクションに問題があります。XmlSerializerを

[XmlRoot("MyRoot", Namespace = XmlNamespace)] 
public class MyRoot 
{ 
    public const string XmlNamespace = "http://sample.com"; 
    public List<MyThing> Things { get; set; } 

} 
[XmlInclude(typeof(This))] 
[XmlInclude(typeof(That))] 
public class MyThing 
{ 
} 
[XmlRoot(Namespace = MyRoot.XmlNamespace)] 
[XmlType("This")] 
public class This : MyThing 
{ 
    public string ThisRef { get; set; } 
} 
[XmlRoot(Namespace = MyRoot.XmlNamespace)] 
[XmlType("That")] 
public class That : MyThing 
{ 
    public string ThatRef { get; set; } 
} 
[TestClass] 
public class so 
{ 
    [TestMethod] 
    public void SerializeTest() 
    { 
     // Create object to serialize 
     var data = new MyRoot { Things = new List<MyThing>() }; 
     data.Things.Add(new This { ThisRef = "this ref" }); 
     data.Things.Add(new That { ThatRef = "that ref" }); 

     // Create XML namespace 
     var xmlNamespaces = new XmlSerializerNamespaces(); 
     xmlNamespaces.Add(string.Empty, MyRoot.XmlNamespace); 

     // Write XML 
     var serializer = new XmlSerializer(typeof(MyRoot)); 
     using (var writer = new StringWriter()) 
     { 
      serializer.Serialize(writer, data, xmlNamespaces); 
      var xml = writer.ToString(); 
      Console.WriteLine(xml); 
     } 
    } 
} 

は、以下のXML生成します:ここで

は、私がこれまで持っているものだ、私はXmlSerializerをするを取得できますか

  1. :だから

    <?xml version="1.0" encoding="utf-16"?> 
    <MyRoot xmlns="http://sample.com"> 
        <Things> 
        <MyThing d3p1:type="This" xmlns:d3p1="http://www.w3.org/2001/XMLSchema-instance"> 
         <ThisRef>this ref</ThisRef> 
        </MyThing> 
        <MyThing d3p1:type="That" xmlns:d3p1="http://www.w3.org/2001/XMLSchema-instance"> 
         <ThatRef>that ref</ThatRef> 
        </MyThing> 
        </Things> 
    </MyRoot> 
    

    を、私は2つの質問があります書き込みこれはそのいいえdesの代わりにMyThingノード?

  2. にはどうすればノードが(現在MyThingノードとして書かれた)ことこのに追加の名前空間情報を追加することからのXmlSerializerを停止することができますか?
+0

できません。代わりに、シリアライザは値 "this"と "that"を持つ 'type'属性を作成します。独自のシリアライザを作成する必要があります。 – jdweng

+0

@jdwengあなたのコメントをありがとうが、私は解決策を見つけることができた。 –

答えて

0

これは、すぐに答えにつながるstackoverflowへの投稿についてですか?私は次のようにするだけでした。

[XmlRoot("MyRoot", Namespace = XmlNamespace)] 
public class MyRoot 
{ 
    public const string XmlNamespace = "http://sample.com"; 
    [XmlArrayItem(Type = typeof(This))] 
    [XmlArrayItem(Type = typeof(That))] 
    public List<MyThing> Things { get; set; } 
} 
public class MyThing 
{ 
} 
public class This : MyThing 
{ 
    public string ThisRef { get; set; } 
} 
public class That : MyThing 
{ 
    public string ThatRef { get; set; } 
} 
関連する問題