2009-06-26 7 views
1

でXMLツリーを読むことあなたたちが私に読んで、このようなXMLへ/から書き込むための方法の例を与えることができる:IXmlSerializable、多くのネストされた要素

<Foolist> 
    <Foo name="A"> 
    <Child name="Child 1"/> 
    <Child name="Child 2"/> 
    </Foo> 
    <Foo name = "B"/> 
    <Foo name = "C"> 
    <Child name="Child 1"> 
     <Grandchild name ="Little 1"/> 
    </Child> 
    </Foo> 
<Foolist> 
+0

(答えコメントする) –

答えて

2

要素名は本当にレベルごとに変化していますか?そうでない場合は、非常に単純なクラスモデルXmlSerializerを使用できます。 IXmlSerializableの実装は...トリッキーです。エラーが発生しやすくなります。絶対に使用しない限り避けてください。

名が異なるが、剛性であるならば、私はちょうどXSDを介して実行したい:XmlSerializerIXmlSerializableなし(各レベルで同じ名前)のために

xsd example.xml 
xsd example.xsd /classes 

using System; 
using System.Collections.Generic; 
using System.Xml.Serialization; 

[XmlRoot("Foolist")] 
public class Record 
{ 
    public Record(string name) 
     : this() 
    { 
     Name = name; 
    } 
    public Record() { Children = new List<Record>(); } 
    [XmlAttribute("name")] 
    public string Name { get; set; } 

    [XmlElement("Child")] 
    public List<Record> Children { get; set; } 
} 

static class Program 
{ 
    static void Main() 
    { 
     Record root = new Record { 
      Children = { 
       new Record("A") { 
        Children = { 
         new Record("Child 1"), 
         new Record("Child 2"), 
        } 
       }, new Record("B"), 
       new Record("C") { 
        Children = { 
         new Record("Child 1") { 
          Children = { 
           new Record("Little 1") 
          } 
         } 
        } 
       }} 
      }; 
     var ser = new XmlSerializer(typeof(Record)); 
     ser.Serialize(Console.Out, root); 
    } 
} 
+0

しかしレコードが他のクラスから継承されている場合、どのメンバーを直列化したくないのですか? – Agzam

+0

次に、子メンバーを[XmlIgnore]としてマークします。またはDataContractSerializerに切り替えて、レイアウトを制御するためにwaveしてください。別の "DTO"クラスのクラスを持つことができます。私は、DTOルートが最善の選択肢であることを期待しています。 –

+0

私はまだIXmlSerializableの使用について考えています。唯一の問題は、私が理解しているように、xmlreaderは '前方のみ'のことです。そして、私は(デ)シリアライゼーションの例を見つけることができませんフラットXMLファイルだけでなく、いくつかの構造。 – Agzam

関連する問題