2015-05-20 85 views
1

我試圖反序列化XML到C#對象(包含對象的數組)XML反序列化到列表

下面是類:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1015")] 
[System.SerializableAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
[System.Xml.Serialization.XmlRootAttribute("I-collection", Namespace = "urn:xtk:queryDef", IsNullable = false)] 
public partial class MyCollection 
{ 

    private List<I> itemsField; 

    public MyCollection() 
    { 
     this.itemsField = new List<I>(); 

    } 

    [System.Xml.Serialization.XmlElementAttribute("I", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)] 
    public List<I> Items 
    { 
     get 
     { 
      return this.itemsField; 
     } 
     set 
     { 
      this.itemsField = value; 
     } 
    } 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1015")] 
[System.SerializableAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
public partial class I 
{ 

    private string EMAILField; 

    private string FIRST_NAMEField; 

    private string INDIVIDUAL_KEYField; 

    private string LANGUAGE_CODEField; 

    private string LAST_NAMEField; 

    private string USERNAMEField; 

    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string EMAIL 
    { 
     get 
     { 
      return this.EMAILField; 
     } 
     set 
     { 
      this.EMAILField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string FIRST_NAME 
    { 
     get 
     { 
      return this.FIRST_NAMEField; 
     } 
     set 
     { 
      this.FIRST_NAMEField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string INDIVIDUAL_KEY 
    { 
     get 
     { 
      return this.INDIVIDUAL_KEYField; 
     } 
     set 
     { 
      this.INDIVIDUAL_KEYField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string LANGUAGE_CODE 
    { 
     get 
     { 
      return this.LANGUAGE_CODEField; 
     } 
     set 
     { 
      this.LANGUAGE_CODEField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string LAST_NAME 
    { 
     get 
     { 
      return this.LAST_NAMEField; 
     } 
     set 
     { 
      this.LAST_NAMEField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string USERNAME 
    { 
     get 
     { 
      return this.USERNAMEField; 
     } 
     set 
     { 
      this.USERNAMEField = value; 
     } 
    } 
} 

嘗試反序列化

MyCollection result = Serialization.Deserialize<MyCollection>(xmle.OuterXml); 

其中xmle.OuterXml是

<I-collection xmlns="urn:xtk:queryDef"> 
    <I EMAIL="[email protected]" FIRST_NAME="" INDIVIDUAL_KEY="5" LANGUAGE_CODE="ENG" LAST_NAME="" USERNAME="UPed" /> 
    <I EMAIL="[email protected]" FIRST_NAME="" INDIVIDUAL_KEY="6" LANGUAGE_CODE="ENG" LAST_NAME="" USERNAME="GO" /> 
    <I EMAIL="[email protected]" FIRST_NAME="" INDIVIDUAL_KEY="7" LANGUAGE_CODE="ENG" LAST_NAME="" USERNAME="ir0" /> 
    <I EMAIL="[email protected]" FIRST_NAME="" INDIVIDUAL_KEY="8" LANGUAGE_CODE="ENG" LAST_NAME="" USERNAME="UPlqfa" /> 
    <I EMAIL="[email protected]" FIRST_NAME="" INDIVIDUAL_KEY="9" LANGUAGE_CODE="ENG" LAST_NAME="" USERNAME="jon17" /> 
    <I EMAIL="[email protected]" FIRST_NAME="" INDIVIDUAL_KEY="10" LANGUAGE_CODE="N/D" LAST_NAME="" USERNAME="ctu_aa4849_jie" /> 
    <I EMAIL="[email protected]" FIRST_NAME="" INDIVIDUAL_KEY="11" LANGUAGE_CODE="ENG" LAST_NAME="" USERNAME="rnopwakc" /> 
    <I EMAIL="[email protected]" FIRST_NAME="" INDIVIDUAL_KEY="12" LANGUAGE_CODE="ENG" LAST_NAME="" USERNAME="TRIsd" /> 
    <I EMAIL="[email protected]" FIRST_NAME="" INDIVIDUAL_KEY="13" LANGUAGE_CODE="ENG" LAST_NAME="" USERNAME="ll20373196" /> 
    <I EMAIL="[email protected]" FIRST_NAME="Sa" INDIVIDUAL_KEY="14" LANGUAGE_CODE="FRA" LAST_NAME="w" USERNAME="wsp" /> 
</I-collection> 

Serialization.Deserialize做到這一點:

public static T Deserialize<T>(string xml) 
     { 
      if (string.IsNullOrEmpty(xml)) 
      { 
       throw new ArgumentNullException("xml"); 
      } 


      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      using (StringReader stream = new StringReader(xml)) 
      { 
       try 
       { 
        return (T)serializer.Deserialize(stream); 
       } 

       catch (Exception ex) 
       { 
        throw new InvalidOperationException("Failed to create object from xml string", ex); 
       } 
      } 
     } 

的問題是它返回的對象是空的(我指的是itemsField列表爲空)。這個反序列化實際上應該使用來自XML權限的數據自動填充列表?還是必須手動執行?

+1

您是否嘗試過刪除'表= System.Xml.Schema.XmlSchemaForm.Unqualified'?正在檢查... –

+0

這是問題所在。謝謝! – Adrian

+0

如果有疑問,作弊:'xsd my.xml'後面跟'xsd my.xsd/c'會生成'my.cs' –

回答

4

Form不正確;嘗試:

[System.Xml.Serialization.XmlElementAttribute("I", Order = 0)] 
0

試試這個

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"C:\temp\test.xml"; 
     static void Main(string[] args) 
     { 

      MyCollection myCollection = new MyCollection(); 

      XmlSerializer xs = new XmlSerializer(typeof(MyCollection.I_Collection)); 
      XmlTextReader reader = new XmlTextReader(FILENAME); 
      MyCollection.I_Collection newRoot = (MyCollection.I_Collection)xs.Deserialize(reader); 

     } 
    } 
    public partial class MyCollection 
    { 
     [XmlRoot("I-collection")] 
     public class I_Collection 
     { 
      [XmlElement("I")] 
      public List<I> itemsField { get; set; } 

     } 

     [XmlRoot("I")] 
     public partial class I 
     { 
      [XmlAttribute("EMAIL")] 
      public string EMAILField { get; set; } 

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

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

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

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

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



}