2016-01-27 94 views
3

我有下面的XML:C#反序列化XML陣列不同類型的成多個陣列

<Applications> 
    <AccessibleApplication></AccessibleApplication> 
    <AccessibleApplication></AccessibleApplication> 
    <EligibleApplication></EligibleApplication> 
    <EligibleApplication></EligibleApplication> 
</Applications> 

有一種反序列化到C#對象這使得AccessibleApplications和EligibleApplications是兩個獨立的數組?我嘗試了以下,但得到一個異常,因爲「應用程序」不止一次使用。

[XmlArray("Applications")] 
[XmlArrayItem("AccessibleApplication")] 
public List<Application> AccessibleApplications { get; set; } 

[XmlArray("Applications")] 
[XmlArrayItem("EligibleApplication")] 
public List<Application> EligibleApplications { get; set; } 

例外情況是: XML元素的命名空間從「應用程序」「」已經存在於當前的範圍。使用XML屬性爲元素指定另一個XML名稱或名稱空間。

這可能嗎?

謝謝!

編輯:我忘了提及,我不想提供一個「Applications」類,只是爲了爲兩個數組提供容器對象。我有幾個這樣的情況,我不想要這些類的混亂,其唯一目的是分裂兩個相同類型的數組。

我希望能夠使用[XmlArrayItem =「Application/AccessibleApplication」]等某種標籤將這兩個數組反序列化爲外部對象,而無需創建「Applications」類。

回答

0

我發現一個相當簡潔的方式來做到這一點,首先要像這樣一類:

using System.Xml.Serialization; 

[XmlRoot] 
public class Applications 
{ 
    [XmlElement] 
    public string[] AccessibleApplication; 
    [XmlElement] 
    public string[] EligibleApplication; 
} 

注意的元素是如何單獨的陣列。現在使用這個類(我的XML在一個單獨的文件中,因此是XmlDocument類)。

var doc = new XmlDocument(); 
doc.Load("../../Apps.xml"); 
var serializer = new XmlSerializer(typeof(Applications)); 
Applications result; 

using (TextReader reader = new StringReader(doc.InnerXml)) 
{ 
    result = (Applications)serializer.Deserialize(reader); 
} 

我們證明這個工程,你可以寫這一切都在一個控制檯應用程序,做一個foreach打印所有值的陣列,像這樣:

foreach (var app in result.AccessibleApplication) 
{ 
    Console.WriteLine(app); 
} 
foreach (var app in result.EligibleApplication) 
{ 
    Console.WriteLine(app); 
} 
0

您可以使用的XmlElement屬性反序列化到不同的列表:

public class Applications 
{ 
    [XmlElement("AccessibleApplication")] 
    public List<Application> AccessibleApplications { get; set; } 

    [XmlElement("EligibleApplication")] 
    public List<Application> EligibleApplications { get; set; } 
} 

public class Application 
{ 
    [XmlText] 
    public string Value { get; set; } 
} 

因此,對於一個示例XML:

<Applications> 
    <AccessibleApplication>xyz</AccessibleApplication> 
    <AccessibleApplication>abc</AccessibleApplication> 
    <EligibleApplication>def</EligibleApplication> 
    <EligibleApplication>zzz</EligibleApplication> 
</Applications> 

下面的代碼片斷將輸出以下:

using (var reader = new StreamReader("XMLFile1.xml")) 
{ 
    var serializer = new XmlSerializer(typeof(Applications)); 
    var applications = (Applications)serializer.Deserialize(reader); 

    Console.WriteLine("AccessibleApplications:"); 
    foreach (var app in applications.AccessibleApplications) 
    { 
     Console.WriteLine(app.Value); 
    } 

    Console.WriteLine(); 

    Console.WriteLine("EligibleApplications:"); 
    foreach (var app in applications.EligibleApplications) 
    { 
     Console.WriteLine(app.Value); 
    } 
} 

輸出:

AccessibleApplications:

XYZ

ABC

EligibleAppli陽離子:

高清

ZZZ

0

你可以使用這個類來創建字符串對象,從對象創建的字符串,並創建一個字節[]從對象

StringToObject

var applicationObject = new XmlSerializerHelper<Applications>().StringToObject(xmlString); 

Obj ectToString

var xmlString = new XmlSerializerHelper<Applications>().ObjectToString(applicationObject); 

ObjectToByteArray

var byteArray = new XmlSerializerHelper<Applications>().ObjectToByteArray(applicationObject); 

的XmlSerializerHelper:

namespace StackOverflow 
{ 
    public class XmlSerializerHelper<T> where T : class 
    { 
     private readonly XmlSerializer _serializer; 

     public XmlSerializerHelper() 
     { 
      _serializer = new XmlSerializer(typeof(T)); 

     } 

     public T ToObject(string xml) 
     { 
      return (T)_serializer.Deserialize(new StringReader(xml)); 
     } 

     public string ToString(T obj, string encoding) 
     { 
      using (var memoryStream = new MemoryStream()) 
      { 
       _serializer.Serialize(memoryStream, obj); 
       return Encoding.GetEncoding(encoding).GetString(memoryStream.ToArray()); 
      } 
     } 

     public byte[] ToByteArray(T obj, Encoding encoding = null) 
     { 
      var settings = GetSettings(encoding); 
      using (var memoryStream = new MemoryStream()) 
      { 
       using (var writer = XmlWriter.Create(memoryStream, settings)) 
       { 
        _serializer.Serialize(writer, obj); 
       } 
       return memoryStream.ToArray(); 
      } 
     } 

     private XmlWriterSettings GetSettings(Encoding encoding) 
     { 
      return new XmlWriterSettings 
      { 
       Encoding = encoding ?? Encoding.GetEncoding("ISO-8859-1"), 
       Indent = true, 
       IndentChars = "\t", 
       NewLineChars = Environment.NewLine, 
       ConformanceLevel = ConformanceLevel.Document 
      }; 
     } 
    } 
} 

您的學生:

[XmlRoot] 
public class Applications 
{ 
    [XmlElement("AccessibleApplication")] 
    public string[] AccessibleApplication { get; set; } 
    [XmlElement("EligibleApplication")] 
    public string[] EligibleApplication { get; set; } 
} 

[XmlRoot] 
public class Applications 
{ 
    [XmlElement("AccessibleApplication")] 
    public List<string> AccessibleApplication { get; set; } 
    [XmlElement("EligibleApplication")] 
    public List<string> EligibleApplication { get; set; } 
} 

乾杯。