2013-02-24 79 views
3

我有一個普通的舊XML文件。通過一些神奇的XSD.EXE我做了一個模型。現在我想將XML數據讀入模型中。通常這只是XmlSerializer.Deserialize,但它一直在抱怨命名空間和什麼。將XML反序列化爲沒有模糊的模型

現在是這樣的事情:我不關心名稱空間或XML中的其他任何東西。我只是想讓反序列化與「簡單單線程」一起工作。我打算在我的生活中解析很多XML,並且我不想花費時間來處理臃腫的格式,這些格式我們都知道並不重要。

所以我正在尋找一個.Net的XML解串器去掉模糊,只是看到一個<obj> <Name> ...並將其數據放入public string Name { get; set; }。它不應該比例如MyObj myObj = SimpleXml.Deserialize<MyObj>(xmlString);更難。非常像JSON解串器工作。

從哪裏可以找到像我所描述的易於使用的XML解串器?

我明白這限制了我的XML閱讀能力。

+1

你不問一個問題。至於我所關心的問題,你問的問題是:你可以很容易地編寫一個擴展方法,它可以完成所有引用的命名空間,然後在將來使用它。 – driis 2013-02-24 09:56:24

+1

我在找東西。如果它需要以問題的形式出現,那麼就想象它以「有人知道這件事?」結尾。或者「任何人都可以幫助我?」或者其他任何模糊的瀰漫性的,可能錯誤地陳述的問題。:) – 2013-02-24 10:15:11

+0

我不明白當XmlSerializer.Deserialize失敗時擴展方法會如何幫助我。我當然可以寫我自己的XML解析器,但我想我會離開這一天。 我的問題的整個觀點..錯誤..聲明是找到一個廉價的簡單懶惰的方式讀取XML數據到模型中。 – 2013-02-24 10:19:18

回答

1

我正在爲我的UI客戶端使用這種助手。

public string Serialize<T>(T o) 
{ 
    var x = new XDocument(); 
    using(var w = x.CreateWriter()) 
     new XmlSerializer(typeof(T)).Serialize(w, o); 
    return x.ToString(); 
} 

public T Deserialize<T>(string s) 
{ 
    return 
     (T)new XmlSerializer(typeof(T)) 
     .Deserialize(XDocument.Parse(s) 
     .CreateReader()); 
} 

當心,如果你使用的是Windows服務,有系列化已知內存泄漏:http://dotnetcodebox.blogspot.fr/2013/01/xmlserializer-class-may-result-in.html

爲了避免這種情況,我建議你創建一個以上方法來代替代碼new XmlSerializer /從緩存中檢索XmlSerializers(例如字典),如博客文章中所述。

+1

+1爲內存泄漏。已經知道它,但這是一個非常重要的事情要注意。 – 2013-02-24 10:41:43

1

通過使用xsd.exe得到了同樣的問題,我不想擁有一個巨大的自動生成的文件,我需要修復它才能工作,而且我花了數小時的時間使用反彙編工作,命名空間,等等。

如果您想要一個沒有模糊的單線解決方案,請嘗試xsd2codehttp://xsd2code.codeplex.com/),它只是起作用。 請注意,您需要閱讀關於生成類的小指南,以便在生成之前獲取所有設置,您不能只是單擊生成,至少對於我來說它沒有正確的默認設置,但它很容易設置正確。

所以我做:

  1. 生成具有XSD.EXE(XSD Hoorah.xml)的XSD,XSD.EXE的那部分是好的。
  2. 生成的類與xsd2code(安裝並請參閱指南)
  3. 使用隨附生成的類從xsd2code

    var hoorah = Hoorah.Deserialize(xml); 
    

的反序列化方法只是工作!