2011-04-20 236 views
0

我想使用下面的xml和類反序列化一些xml。我遇到的問題是xml元素名稱與我想用於我的類的名稱不匹配。我試圖使用XmlRoot來指定一個元素名稱,但一直沒有能夠得到它的工作。任何幫助,將不勝感激。反序列化XML

<Results recordReturn="3" xmlns="http://www.zzz.com/"> <Result> <key>98937747-0596-42e6-aa5b-e180d35f649e</key> <code>AFGHANISTAN</code> <number>004</number> </Result> <Result> <key>100ab860-f2a5-48ed-911c-31753b79234f</key> <code>ALBANIA</code> <number>008</number> </Result> <Result> <key>67ecc235-d44a-41e0-b2a0-7a9c00e30a0e</key> <code>ALGERIA</code> <number>012</number> </Result>

[Serializable] 
[XmlRoot("Result", Namespace = "http://www.zzz.com/")]  
public class Country 
{ 
    public Country() 
    { } 

    public string key; 
    public string code; 
    public string number; 
} 

[Serializable] 
[XmlRoot(ElementName = "Results", Namespace = "http://www.zzz.com/")] 
public class Countries : System.Collections.CollectionBase 
{ 
    public Country this[int nIndex] 
    { 
     get { return (Country)this.InnerList[nIndex]; } 
    } 

    public void Add(Country oCountry) 
    { 
     this.List.Add(oCountry); 
    } 
} 


//Code below is in separate class file 
    public static Countries GetAllCountries() 
    { 
     XmlNode countriesNode = //omitting code to get country xml 
     Countries countryList = new Countries(); 
     XmlSerializer serializer = new XmlSerializer(typeof(Countries)); 
     System.Xml.XmlNodeReader oReader = new System.Xml.XmlNodeReader(countriesNode); 
     countryList = (Countries)serializer.Deserialize(oReader); 

     return countryList; 
    } 

回答

0

XmlSerializer的具有接受要使用的根標籤的構造函數。這應該有所幫助。我會一直創建我的類的一些示例實例,並將這些實例序列化。這樣就很容易找出如何微調xml序列化/反序列化。

1

假設你有固定的格式,並有一個有效的XML:

<Results recordReturn="3" xmlns="http://www.zzz.com/"> 
    <Result> 
    <key>98937747-0596-42e6-aa5b-e180d35f649e</key> 
    <code>AFGHANISTAN</code> 
    <number>004</number> 
    </Result> 
    <Result> 
    <key>100ab860-f2a5-48ed-911c-31753b79234f</key> 
    <code>ALBANIA</code> 
    <number>008</number> 
    </Result> 
    <Result> 
    <key>67ecc235-d44a-41e0-b2a0-7a9c00e30a0e</key> 
    <code>ALGERIA</code> 
    <number>012</number> 
    </Result> 
</Results> 

下應該只是罰款:從嘗試手動推斷屬性除了

[XmlRoot("Result")] 
public class Country 
{ 
    [XmlElement("key")] 
    public string Key { get; set; } 
    [XmlElement("code")] 
    public string Code { get; set; } 
    [XmlElement("number")] 
    public string Number { get; set; } 
} 

public class Results 
{ 
    [XmlAttribute("recordReturn")] 
    public int RecordReturn { get; set; } 

    [XmlElement("Result")] 
    public Country[] Countries { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var serializer = new XmlSerializer(typeof(Results), "http://www.zzz.com/"); 
     using (var reader = XmlReader.Create("test.xml")) 
     { 
      var results = (Results)serializer.Deserialize(reader); 
      // TODO : exploit the results 
     } 
    } 
} 
0

,一個鮮爲人知的功能的.Net SDK是xsd.exe可以爲你做的工作。在.Net命令提示符處輸入:

xsd.exe <name of your schema>.xsd /classes 

它將爲該模式創建正確的序列化類。如果您沒有架構,可以讓xsd.exe爲您生成一個架構。只需傳遞一個樣本XML文件,就像您提供的參數一樣,它將生成相應的xsd文件。

生成的類是不完整的,所以如果碰巧重新生成它們,您可以擴展它們而不必重新應用所有更改。

除了「/ classes」之外,還有其他一些可能派上用場的開關,例如生成實現INotifyPropertyChanged的類的「/ ebd」,或生成簡單字段而不是屬性的「/ fields」。

0

[XmlRoot]僅在該類用作文檔的根元素時才使用。要指定一般要使用的元素名稱,請使用[XmlType]