2012-04-27 71 views
1

我一直在閱讀有關反序列化,DOM,LINQ to XML以及LINQ to XSD的這些日子......有一段時間,但作爲一名新手,我並沒有真正瞭解整個圖片,所以我會盡力向你解釋我的風景:將數據傳遞到XML的視圖

我從另一個獲取xml,我只是試圖顯示在MVC項目視圖中隨附的信息。

我真的沒有一個xsd,所以我估計它反序列化到一個對象我將不得不使用XSD工具來創建一個方案,然後匹配這個方案,然後填充這個類,然後使用它的類一個看法。我認爲這可以通過一個示例xml來完成,對嗎?

另一種選擇是創建「我的對象」並通過DOM填充它。我最近做了類似的事情(我發佈了一個關於它的問題),甚至嘗試了一些LINQ方法(我讀過LINQ to XSD已經被微軟放棄了)。

對於我想要做的簡單事情,我會去LINQ to XML,但說實話我沒有完全理解我已閱讀​​的關於不同方法的優缺點的所有差異,所以如果有人可以幫助我決定我真的很感激它。

在此先感謝

回答

1

我將分享我們當前項目中使用的XMLManager。這是很容易使用,你只是傳遞要serialze並從對象的類型,就像這樣:

YourObject myObject = new YourObject(); 
myObject.SomeInfoString = "Hello World"; 
XMLManager<YourObject>.SerialzeToFile(myObject, pathToSaveTo) 

YourObject loadedObject = XMLManager<YourObject>.SerialzeFromFile(pathToYourFile) 

這裏的實現(請注意,你可能想要做在catch子句的東西,我已經刪除了我們在那裏做,因爲它是具體到了執行):

using System; 
using System.Diagnostics; 
using System.IO; 
using System.Reflection; 
using System.Xml; 
using System.Xml.Serialization; 

/// <summary> 
/// The XMLManager can be used to serialize to and from XML files. 
/// </summary> 
/// <typeparam name="T">The type to serialize.</typeparam> 
public static class XmlManager<T> 
{ 
    /// <summary> 
    /// Static method SerializeFromFile 
    /// </summary> 
    /// <param name="path"> 
    /// The path. 
    /// </param> 
    /// <returns> 
    /// returns T 
    /// </returns> 
    public static T SerializeFromFile(string path) 
    { 
     try 
     { 
      using (var xmlStream = new FileStream(path, FileMode.Open)) 
      { 
       return FromStream(xmlStream); 
      } 
     } 
     catch (Exception ex) 
     { 
      return default(T); 
     } 
    } 

    /// <summary> 
    /// Method FromStream 
    /// </summary> 
    /// <param name="xmlStream"> 
    /// The xml stream. 
    /// </param> 
    /// <returns> 
    /// returns T 
    /// </returns> 
    public static T FromStream(Stream xmlStream) 
    { 
     try 
     { 
      var xmlReader = XmlReader.Create(xmlStream); 
      var serializer = new XmlSerializer(typeof(T)); 

      var value = (T)serializer.Deserialize(xmlReader); 
      return value; 
     } 
     catch (Exception ex) 
     { 
      return default(T); 
     } 
    } 

    /// <summary> 
    /// Method SerializeToFile 
    /// </summary> 
    /// <param name="xmlObject"> 
    /// The xml object. 
    /// </param> 
    /// <param name="xmlPath"> 
    /// The xml path. 
    /// </param> 
    /// <param name="overwriteExisting"> 
    /// The overwrite existing. 
    /// </param> 
    public static void SerializeToFile(T xmlObject, string xmlPath, bool overwriteExisting) 
    { 
     try 
     { 
      var mode = overwriteExisting ? FileMode.Create : FileMode.CreateNew; 
      using (var xmlStream = new FileStream(xmlPath, mode)) 
      { 
       ToStream(xmlObject, xmlStream); 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

    /// <summary> 
    /// Method ToStream 
    /// </summary> 
    /// <param name="xmlObject"> 
    /// The xml object. 
    /// </param> 
    /// <param name="xmlStream"> 
    /// The xml stream. 
    /// </param> 
    public static void ToStream(T xmlObject, Stream xmlStream) 
    { 
     try 
     { 
      var xmlSettings = new XmlWriterSettings { Indent = true, NewLineOnAttributes = false }; 

      var writer = XmlWriter.Create(xmlStream, xmlSettings); 
      var serializer = new XmlSerializer(typeof(T)); 

      serializer.Serialize(writer, xmlObject); 
     } 
     catch (Exception ex) 
     { 
     } 
    } 
} 

將此信息傳遞到一個視圖您在你使用XMLManager反序列化對象的視圖模型的屬性,以及通過XAML綁定它。

public string MyObjectInfoString 
{ 
    get 
    { 
     return this.myObject.InfoString; 
    } 

    set 
    { 
     if (this.myObject.InfoString == value) 
     { 
      return; 
     } 

     this.myObject.InfoString = value; 
     RaisePropertyChanged("MyObjectInfoString"); 
    } 
} 

[編輯]還不如顯示XAML以及:

<TextBlock Text="{Binding MyObjectInfoString}" /> 
+0

非常感謝,Amadeus的。但是我想知道的,不僅僅是一個具體的實現,是什麼方法是最好的,因爲我的XML不是很複雜 – mitomed 2012-04-27 07:53:41

相關問題