簡體   English   中英

使用多個名稱空間將XML反序列化為對象

[英]Deserialize XML with multiple namespaces to objects

我試圖將此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; }
}

你有幾個問題:

  1. 您定義了一個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> 

    所以你需要在<item>元素周圍有一個<Items>...</Items>包裝器。

  2. 你有這個聲明:

     [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時,我確實很好地填充了這些對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM