2016-05-06 8 views
0

私はサードパーティのAPIにウェブリクエストを行い、その応答をC#クラスに動的に逆シリアル化したいと思います。しかし、私は時々オブジェクトのリストと時にはオブジェクトのリストを取得しているという問題があります。xmlをC#クラスに動的に逆シリアル化します

すでに 'objectClass'がxmlに存在するようなエラーが表示されます。

解決策は次のとおりです。両方の応答に異なるクラスを定義する必要があります。 1つのクラスを使用してこのXMLを非直列化する他のオプションはありますか?

サンプル応答:他の応答において

<data listtype="objectClass" count="1"> 
    <objectClass> 
    </objectClass> 
</data> 

<data listtype="objectClass" count="2" totalcount="2" numremaining="0"> 
    <objectClass> 
    <!-- Properties -->   
    </objectClass> 
    <objectClass> 
    <!-- Properties -->   
    </objectClass> 
</data> 

クラス:

[XmlRoot(ElementName = "data")] 
public class Data 
{ 

    [XmlElement(ElementName = "objectClass")] 
    public objectClass ObjectItem { get; set; }  

    [XmlElement(ElementName = "objectClass")] 
    public List<objectClass> ObjectItemList { get; set; } 
} 

編集

A最後に、応答xmlには別のケースでオブジェクト名が含まれていることがわかりました。

サンプル応答:他の応答で

<data listtype="objectClass" count="1"> 
    <objectClass> 
    </objectClass> 
</data> 

<data listtype="OBJECTCLASS" count="2" totalcount="2" numremaining="0"> 
    <OBJECTCLASS> 
    <!-- Properties -->   
    </OBJECTCLASS> 
    <OBJECTCLASS> 
    <!-- Properties -->   
    </OBJECTCLASS> 
</data> 

私は私のデータクラスに1つの以上の要素を追加して、それが機能するようになりました。

[XmlElement(ElementName = "OBJECTCLASS")] 
public List<OBJECTCLASS> ObjectItem { get; set; } 

答えて

1

リストオプションはいつでも使用できます。あなたは一つのオブジェクトを持っている場合は、リスト内の1つの項目が存在することになるよう ...

あなたはこのようなあなたのクラスを変更することができます。

[XmlRoot(ElementName = "data")] 
public class Data 
{ 
    [XmlElement(ElementName = "objectClass")] 
    public List<objectClass> ObjectItemList { get; set; } 
} 
1

をあなたはXMLのデシリアライザを助けるためにXMLArrayXmlArrayItemを使用する必要がありますオブジェクトをListItemsに解析します。

[XmlRoot(ElementName = "data")] 
public class Data 
{ 
    [XmlArray("data")] 
    [XmlArrayItem("objectClass")] 
    public List<objectClass> ObjectItemList { get; set; } 
} 
関連する問題