动态地反序列化xml到C#类

时间:2016-05-06 07:13:41

标签: c# xml deserialization

我正在向第三方API发出Web请求,并希望动态反序列化对C#类的响应。但是有一个问题,作为回应,我有时得到对象列表,有时候有一个对象。

它给出了一些错误,就像已经在'xml中'存在'objectClass'一样。

我知道解决方案是:我需要为两个响应定义不同的类。是否还有其他选项可以使用一个类反序列化此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; }
}

修改

最后我发现响应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>

我在我的数据类中添加了一个元素,现在可以正常工作了。

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

2 个答案:

答案 0 :(得分:1)

您始终可以使用列表选项。 就像你有一个对象一样,列表中会有一个项目......

您可以像这样修改您的课程:

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

答案 1 :(得分:1)

您需要使用XMLArrayXmlArrayItem来帮助XML反序列化器将对象解析为ListItems

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