【问题标题】:Empty List when deserializing XML to Object将 XML 反序列化为对象时的空列表
【发布时间】:2016-08-19 10:46:12
【问题描述】:

我在将 XML 反序列化为带有列表的对象时遇到问题。反序列化运行没有错误,但资源列表为空,我知道 XML 中返回了一个资源。似乎只是没有正确反序列化。

我正在使用以下代码进行反序列化

            var ser = new XmlSerializer(typeof(SearchResult));
            var test = result.Content.ReadAsStringAsync();
            var t = (SearchResult)ser.Deserialize(result.Content.ReadAsStreamAsync().Result);

上面代码第2行的变量“test”等于

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns3:searchResult total="1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns3="ers.ise.cisco.com">
<resources>
<resource id="76a4b0f2-64e2-11e6-9f15-00505688a404" name="5555884552">
<link rel="self" href="https://servername123:9060/ers/config/guestuser/76a4b0f2-64e2-11e6-9f15-00505688a404" type="application/xml"/>
</resource>
</resources>
</ns3:searchResult>

所以我希望在资源列表中获得一个 ExistingWifiAccountDto。但我没有。它是空的。我做错了什么?

对象映射的类如下

[XmlRoot(ElementName = "searchResult", Namespace = "ers.ise.cisco.com")]
public class SearchResult
{
    public SearchResult()
    {
        Resources = new List<ExistingWifiAccountDto>();
    }

    [XmlArray("resources")]
    [XmlArrayItem("resource", typeof(ExistingWifiAccountDto))]
    public List<ExistingWifiAccountDto> Resources { get; set; }
}

public class ExistingWifiAccountDto
{
    public ExistingWifiAccountDto()
    {
    }

    [XmlAttribute("id")]
    public string Id { get; set; }
    [XmlAttribute("name")]
    public string Name { get; set; }
    [XmlElement("link")]
    public LinkDto Link { get; set; }
}

public class LinkDto
{
    public LinkDto()
    {
    }

    [XmlAttribute("rel")]
    public string Rel { get; set; }
    [XmlAttribute("href")]
    public string Href { get; set; }
    [XmlAttribute("type")]
    public string Type { get; set; }
}

【问题讨论】:

    标签: c# xml deserialization


    【解决方案1】:

    您必须将命名空间设置为“资源”数组的空字符串,因为在您的情况下它不会被继承。然后,这应该流向子元素。

    尝试改变

    [XmlArray("resources")]
    

    [XmlArray("resources", Namespace = "")]
    

    这将导致它正确反序列化,或者,您也可以使用 Form 属性从“资源”设置每个节点:

    Form = XmlSchemaForm.Unqualified
    

    干杯

    【讨论】:

    • 在将命名空间设置为空资源后完美运行。谢谢!
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    相关资源
    最近更新 更多