2012-07-26 95 views
0

我有一個第三方API,它看起來像這樣一些XML:Xml反序列化或格式不正確?

<root> 
    <Data> 
    <sub_id>3</sub_id> 
    <email>[email protected]</email> 
    </Data> 
    <Data> 
    <sub_id>7</sub_id> 
    <email>[email protected]</email> 
    </Data> 
</root> 

而且我想它反序列化到這樣一類:

public class root 
    { 
     //[XmlArray("Datas")] 
     [XmlArrayItem("Data", typeof(Data))] 
     public Data[] Data { get; set; } 
    } 

    public class Data 
    { 
     public int subscriber_id { get; set; } 
     public string email { get; set; } 
    } 

但是,當然,這並未」工作。 如果我插入一個元素來包裝'Data'元素的數組,但是我不能,我已經註釋到的'Datas'這條線可以解決這個問題。正如我所說的,這個XML來自第三方(對XML的工作方式稍微鬆懈)。

那麼這是可以用一些不同的C#代碼/屬性嗎?

回答

1

刪除類根和反序列化數組本身(也將類中的subscriber_id重命名爲sub_id)。下面是代碼

var serializer = new XmlSerializer(typeof(Data[]), new XmlRootAttribute("root")); 
      Data[] datas; 
      using (var tr = new StringReader(xml)) 
      { 
       datas = (Data[])serializer.Deserialize(tr); 
      } 

但是如果反序列化是所有你需要與源XML格式作爲,那麼你可以使用XLINQ解析那麼簡單,它是更有效(10 VS 20秒,我的機器上百萬deserializations ):

var xml = 
@"<root> 
    <Data> 
    <sub_id>3</sub_id> 
    <email>[email protected]</email> 
    </Data> 
    <Data> 
    <sub_id>7</sub_id> 
    <email>[email protected]</email> 
    </Data> 
</root>"; 
var xdoc = XDocument.Parse(xml); 
foreach (var dataElem in xdoc.Root.Elements("Data")) 
{ 
    var subId = int.Parse(dataElem.Element("sub_id").Value); 
    var email = dataElem.Element("email").Value; 
} 
+0

不錯的工作夥計!我確信這是可能的,因爲它看起來像嵌套的xml,但我甚至沒有想到這種類型(Data [])的東西。謝謝! – LoveMeSomeCode 2012-07-27 13:35:30

0

xml格式不正確。您只需使用[XmlElement]而不是[XmlArray]。例如:

[XmlRoot("root")] 
    public class Root 
    { 
     [XmlElement] 
     public Data[] Data { get; set; } 
    } 

    public class Data 
    { 
     [XmlElement("sub_id")] 
     public int SubscriberId { get; set; } 

     [XmlElement("email")] 
     public string Email { get; set; } 
    } 

我剛剛測試過上面的樣品,它裝的很好。