2017-01-05 7 views
0

次のクラス:どのように必要なXMLのシリアル化を達成するには?

public class CodelistFilters 
    { 
     [System.Xml.Serialization.XmlArray] 
     public List<CodelistFilterAndElement> AndGroup; 

    } 
    public class CodelistFilterAndElement 
    { 
     [System.Xml.Serialization.XmlArray] 
     public List<CodelistFilterOrElement> OrGroup; 

     [System.Xml.Serialization.XmlAttribute] 
     public string Relationship { get { return "And"; } } 
    } 

    public class CodelistFilterOrElement 
    { 
     [System.Xml.Serialization.XmlElement] 
     public List<CodelistFilter> CodelistFilters; 

     [System.Xml.Serialization.XmlAttribute] 
     public string Relationship { get { return "Or"; } } 
    } 

    public class CodelistFilter 
    { 
     [System.Xml.Serialization.XmlAttribute] 
     public string Name { get; set; } 

     [System.Xml.Serialization.XmlAttribute] 
     public string Value1 { get; set; } 

     [System.Xml.Serialization.XmlAttribute] 
     public string Value2 { get; set; } 

    } 

は、私は一種の理解

<CodelistFilters xmlns:xsi="http://www.w3.org/2001/XMLSchema"> 
<AndGroup> 
    <CodelistFilterAndElement> 
     <OrGroup> 
      <CodelistFilterOrElement> 
       <CodelistFilters> 
        <CodelistFilter Name="Description" Value1="test" /> 
       </CodelistFilters> 
      </CodelistFilterOrElement> 
     </OrGroup> 
    </CodelistFilterAndElement> 
</AndGroup> 

としてシリアライズされます。しかし、私はこれを達成するために何をしようとしている:

<CodelistFilters xmlns:xsi="http://www.w3.org/2001/XMLSchema"> 
<Group Relationship="And"> 
    <Group Relationship="Or"> 
     <CodelistFilters Name="Description" Value1="test" /> 
    </Group> 
</Group> 

どのように私はこれを達成するために、私のC#クラスを構築する必要がありますか?私はXmlAttributesと入れ子にされたリストを使いこなそうとしましたが、ちょうど異なるバージョンの "間違った"で終わります。

+0

xmlにタグを持つクラスと同じ数のクラスを用意する必要があります。 2つのタグ(Group、およびCodelListFilters)が必要ですが、4つのクラスがあります。 – jdweng

+0

jdwengありがとうございますが、リストであるプロパティを含むクラスではなく、リストであるクラスをどのようにコードするのか分かりません。 – user489998

+0

プロパティはクラスの子です。 XMLでは、タグは別のタグの子です。したがって、あなたのxmlグループではGroup of Childですので、GroupはGroupの子です。あなたの場合、Groupクラスには2つのタイプの子(GroupとCodeListFilters)があります。また、CodeListFiltersには、2つのタイプの子(GroupおよびCodeListFilters)があります。だからあなたは4つではなく、2つのクラスだけが必要です。 – jdweng

答えて

2

コメントにヒントがあるように、XMLとクラスの間に1対1のマッピングが必要です。必要なXMLには3つの要素しかないので、これらを表すために3つのクラスが必要です。

public class CodelistFilters 
{  
    [XmlElement("Group")] 
    public List<Group> Groups { get; set; } 
} 

public class Group 
{ 
    [XmlAttribute] 
    public string Relationship { get; set; } 

    [XmlElement("Group")] 
    public List<Group> Groups { get; set; } 

    [XmlElement("CodelistFilter")] 
    public List<CodelistFilter> CodelistFilters { get; set; } 
} 

public class CodelistFilter 
{ 
    [XmlAttribute] 
    public string Name { get; set; } 

    [XmlAttribute] 
    public string Value1 { get; set; } 

    [XmlAttribute] 
    public string Value2 { get; set; } 
} 

作業デモについては、this fiddleを参照してください。

+0

多くのありがとう、チャールズ。フィドルは「メモリ不足」例外を出すようだ。私は、クラスGroupにはGroupオブジェクトのリストがあるためだと思います。 – user489998

+0

@ user489998いいえ、フィドルは私のためにうまく動作します。それが記憶に残っていると確信していますか?サンプルを実行するときにサイトが時折タイムアウトすることがあります。しばしばもう一度試してみる必要があります。 –

+0

もう一度試してみるとうまくいきます。ありがとう、チャールズ。 – user489998

関連する問題