2016-03-31 15 views
3

非常に複雑なサードパーティのWebサービスからデータを取得しています。 XSDツールは特定のスキーマでは機能しないため、すべてのデータオブジェクトを手動で構築しようとしています。複数の種類のXMLリスト

<Children> 
    <Activity></Activity> 
    <Activity></Activity> 
    <Container></Container> 
    <Activity></Activity> 
    <Container></Container> 
    ... 
</Children> 

本質的に、コレクション内の各アイテムは、アクティビティまたはコンテナのいずれかであることができますが、両方ではありません。

私は、XMLをデシリアライズ/シリアライズするためにC#でのXmlSerializerを使用しようとしていると私は現在、そのように見えるシリアライザをバックアップするオブジェクトライブラリを持っている:

[XmlType(AnonymousType = true)] 
public class Children: XmlEntityBase, IChildren 
{ 
[XmlElement("Children", IsNullable = false)] 
public List<ChildrenItems> ChildrenItems { get; } = new List<ChildrenItems>(); 
} 

[XmlType(AnonymousType = true)] 
public class ChildrenItem: XmlEntityChoice, IChildrenItem 
{ 
[NotMapped] 
[XmlElement(nameof(Activity), Type = typeof(Activity), IsNullable = false)] 
[XmlElement(nameof(Container), Type = typeof(Container), IsNullable = false)] 
public object SelectedValue 
{ 
    get { return _selectedValue; } 
    set 
    { 
    if(_selectedValue == value) return; 
    SetValue(value); 
    } 
} 

[XmlIgnore] 
public Activity Activity 
{ 
    get 
    { 
    if(ValueType == typeof(Activity)) 
    { 
    return (Activity)SelectedValue; 
    } 
    throw new ChoiceTypeException($"Invalid Type: {nameof(Activity)}!"); 
    } 
} 

[XmlIgnore] 
public Container Container 
{ 
    get 
    { 
    if(ValueType == typeof(Container) 
    { 
    return (Container)SelectedValue; 
    } 
    throw new ChoiceTypeException($"Invalid Type: {nameof(Container)}!"); 
    } 
} 
} 

ChildrenItemは、XSDをコーディングで私の試みです。 XMLの選択肢。

残念ながら、WebServiceからXMLをデシリアライズすると、Childrenコレクションはスキップされます。

1)XMLを正しく処理できるようにオブジェクトを修正するにはどうすればよいですか? 2)xsd:choice要素を扱うより良い方法は、私がここでやっているやり方よりも優れていますか?

大変ありがとうございました!

答えて

1

これは本当に必要なものです。あなたのケースでは動作しないタグの追加のレイアウトを作成するため、配列を使用しないでください。 XmlElementは配列やリストで動作します。

[XmlRoot("Children")] 
    public class Children 
    { 
     [XmlElement("Activity")] 
     List<Activity> activity { get; set; } 

     [XmlElement("Container")] 
     List<Container> container { get; set; } 
    } 
    [XmlRoot("Activity")] 
    public class Activity 
    { 

    } 
    [XmlRoot("Container")] 
    public class Container 
    { 

    } 
+0

ちょっとメモ。クラスを検証してシリアル化されたXMLとXMLを比較しようとすると、コードを直列化する方が簡単です。クラスが適切にシリアル化される場合は、それらもデシリアライズする必要があります。 – jdweng

関連する問題