微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 将具有多个名称空间的XML反序列化为对象

我试图将此XML反序列化为C#.NET 4.5中的对象:

<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/"
       xmlns:upnp="urn:schemas-upnp-org:Metadata-1-0/upnp/"
       xmlns="urn:schemas-upnp-org:Metadata-1-0/DIDL-Lite/">
    <item id="28" parentID="19" restricted="1">
        <dc:creator>Alicia Keys</dc:creator> 
        <dc:date>2003-01-01</dc:date>
        <dc:title>Gangsta lovin&apos; (feat. Alicia Keys)</dc:title>
    </item>
</DIDL-Lite>

码:

我没有得到任何“项目”列表.该对象未反序列化.

MemoryStream reader = new MemmoryStream(System.Text.Encoding.Unicode.GetBytes(Result));
var ser = new XmlSerializer(typeof(DIDLLite));
DIDLLite device = (DIDLLite)ser.Deserialize(reader);

DIDLLite类:

[XmlRoot("DIDL-Lite", Namespace = "urn:schemas-upnp-org:Metadata-1-0/DIDL-Lite/")]
public class DIDLLite {
    DIDLLite() {
        this.serviceItem = new List<ContainerItem>();
    }

    [System.Xml.Serialization.XmlArrayItem("item", typeof(ServiceListTypeService), IsNullable = false)]
    List<ContainerItem> serviceItem = new List<ContainerItem>();
}      

ContainerItem类:

public class ContainerItem
{
    [System.Xml.Serialization.XmlAttribute("id")]
    public string id { get; set; }

    [System.Xml.Serialization.XmlAttribute("parentID")]
    public string parentID { get; set; }

    [System.Xml.Serialization.XmlAttribute("restricted")]
    public string restricted { get; set; }

    [System.Xml.Serialization.XmlAttribute("searchable")]
    public string searchable { get; set; }

    public string title { get; set; }
}

解决方法:

你有几个问题:

>您定义了一个XmlArrayItem属性 – 但实际上,在您的XML中,您没有任何项目列表.如果你想使用Xml数组结构,你需要为你的XML提供类似的东西:

<DIDL-Lite .....>
    <Items>
       <item id="28" parentID="19" restricted="1">
        ......
       </item>
       <item id="29" parentID="19" restricted="1">
        ......
       </item>
    </Items>
</DIDL-Lite>

所以你需要一个< Items> …< / Items>你的< item>周围的包装器元素.
>你有这个声明:

[XmlArrayItem("item", typeof(ServiceListTypeService), IsNullable = false)]

但是ServiceListtypeService定义在哪里?我没有看到任何痕迹….

我简化了你的代码 – 这很好用:

[XmlRoot("DIDL-Lite", Namespace = "urn:schemas-upnp-org:Metadata-1-0/DIDL-Lite/")]
public class DIDLLite
{
    [XmlElement("item")]
    public ContainerItem Item { get; set; }
}


public class ContainerItem
{
    [XmlAttribute("id")]
    public string id { get; set; }

    [XmlAttribute("parentID")]
    public string parentID { get; set; }

    [XmlAttribute("restricted")]
    public string restricted { get; set; }

    [XmlAttribute("searchable")]
    public string searchable { get; set; }

    // you were missing these elements and their namespace

    [XmlElement(Namespace = "http://purl.org/dc/elements/1.1/")]
    public string creator { get; set; }
    [XmlElement(Namespace = "http://purl.org/dc/elements/1.1/")]
    public string date { get; set; }
    [XmlElement(Namespace = "http://purl.org/dc/elements/1.1/")]
    public string title { get; set; }
}

现在,当我运行你的代码来反序列化你的XML时,我确实很好地填充了这些对象.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。