2017-08-17 174 views
0

我有我的問題給你。我想以特定的方式讀取XML數據,但我不知道如何處理它。我會爲你的建議感到高興。Xml數據反序列化

想象一下,我有XML就像這個例子:

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfAbstractData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <!-- COMMON PART --> 
    <AbstractData xsi:type="Test1Data"> 
    <Enable>true</Enable> 
    <Id>1</Id> 
    <Count>3</Count> 
    <Debug>false</Debug> 
    <Error>true</Error> 
    <Info> 
     ..... 
    </Info> 

    <!-- SPECIFIC PART --> 

    ..... 

    </AbstractData> 
    <AbstractData xsi:type="Test2Data"> 
    <!-- COMMON PART --> 
    <Enable>true</Enable> 
    <Id>2</Id> 
    <Count>3</Count> 
    <Debug>false</Debug> 
    <Error>false</Error> 
    <Info> 
     ..... 
    </Info> 

    <!-- SPECIFIC PART --> 

    ..... 

    </AbstractData> 
    <AbstractData xsi:type="Test3Data"> 
    <!-- COMMON PART --> 
    <Enable>true</Enable> 
    <Id>3</Id> 
    <Count>3</Count> 
    <Debug>false</Debug> 
    <Error>true</Error> 
    <Info> 
     ..... 
    </Info> 

    <!-- SPECIFIC PART --> 

    ..... 

    </AbstractData> 
</ArrayOfAbstractData> 

正如你可以看到,即時通訊序列化在表3個不同的對象。這些對象具有稱爲AbstractData的公共基類。

現在我想讀取這些數據,但以非常特定的方式。首先,我只想閱讀通用部分(抽象類的屬性)。基於這些屬性,我將決定類Test1Data,Test2Data,...是否衆所周知。如果他們是衆所周知的,我會將XML文件的其餘部分變成紅色。簡單地說,我想避免在Abstract Base類中使用XmlInclude,因爲Im在插件系統中使用它,而不是在反序列化時使用每個類。

希望你明白我的意圖。

感謝您的建議

+0

嗨,歡迎來到StackOverflow。當您發佈有關您編寫的某些代碼無法正常工作的問題時,您需要提供三件事情。 1.你所看到的行爲以及你認爲這是錯誤的原因; 2.展示你所看到的行爲所需的最少代碼和/或步驟;以及3.你希望看到的行爲。除非你提供這些東西,否則我們很難幫助你。 –

+0

謝謝,但我不需要代碼。我來這裏只是想知道如何去做。我解釋了我想要做什麼以及我試圖避免什麼(XmlInclude)的意圖。我完全能夠讀取這個Xml,但只有當像Test1Data,Test2Data,...這樣的類是已知的。代碼是不需要的。我不能讀取子類(特定部分)未知時的基類屬性(公共部分)。 – Turdus

+0

可以使用多種不同的方法來完成對XML文件的讀取。您可以使用序列化來讀取整個或部分XML文件並將數據存儲到類中。在使用此方法之前,您需要定義類。我推薦的常見數據。然後可以使用XmlDocument類或XDocument類讀取xml的可選部分。 – jdweng

回答

0

使用XmlInclude屬性來指定所有可能的類型。

public class ArrayOfAbstractData 
{ 
    [XmlElement("AbstractData")] 
    public AbstractData[] AbstractData { get; set; } 
} 

[XmlInclude(typeof(Test1Data))] 
[XmlInclude(typeof(Test2Data))] 
[XmlInclude(typeof(Test3Data))] 
public class AbstractData 
{ 
    public bool Enable { get; set; } 
    public byte Id { get; set; } 
    public byte Count { get; set; } 
    public bool Debug { get; set; } 
    public bool Error { get; set; } 
    public string Info { get; set; } 
} 

public class Test1Data : AbstractData 
{ 
    public string Foo { get; set; } 
} 

public class Test2Data : AbstractData 
{ 
    public string Bar { get; set; } 
} 

public class Test3Data : AbstractData 
{ 
    public string Baz { get; set; } 
} 

它應該工作。

var xs = new XmlSerializer(typeof(ArrayOfAbstractData)); 

ArrayOfAbstractData arr; 

using (var fs = new FileStream("test.xml", FileMode.Open)) 
    arr = (ArrayOfAbstractData)xs.Deserialize(fs); 

foreach (var x in arr.AbstractData) 
{ 
    Console.WriteLine(x.GetType()); 
} 
+0

謝謝,但這正是我想避免的:)。我不會知道每一種將保存在XML中的類型。當然在這種情況下,這很容易。我已經解決了這個問題。看到我上面的評論 – Turdus