2012-06-20 37 views
0

我需要從XML讀取數據到列表<>。 XML文件包含三個表格格式 XML:WPF從XML讀取數據到列表<>

<?xml version="1.0" standalone="yes"?> 
<Test> 
    <Table1> 
    <Column_tb1>8</Column_tb1> 
    </Table1> 
    <Table2> 
    <Column_tb2_AA>1</Column_tb2_AA> 
    <Column_tb2_BB>11</Column_tb2_BB> 
    </Table2> 
    <Table2> 
    <Column_tb2_AA>2</Column_tb2_AA> 
    <Column_tb2_BB>22</Column_tb2_BB> 
    </Table2> 
    <Table3> 
    <Column_tb3_AA>2</Column_tb1_AA> 
    <Column_tb3_BB>1</Column_tb1_BB> 
    <Column_tb3_CC>25</Column_tb1_CC> 
    </Table3> 
</Test> 

數據集可以讀取很簡單,

DataSet dsProfile = new DataSet(); 
dsProfile.ReadXml(strProfile); 

通過這一聲道三分數據表將在dsprofile自動。 如何使用列表作爲容器來保存XML文件數據? 如果只有一個表格式的,我能做到這一點:

List<Table1> listtable1 = new List<Table1>(); 
XmlSerializer serializer = new XmlSerializer(typeof(List<Table1>)); 
FileStream stream = File.OpenWrite("data.XML"); 
serializer.Serialize(stream, listtable1); 

但也有3種類型的文件表。如果我仍然想使用列表<>,我該怎麼辦?

問候。

+0

請從影片名稱去掉 「WPF」,你的問題無關用它做.. – SvenG

回答

1

我認爲你的方法不是很安全。您可以選擇讓一切強類型,並定義爲:

  1. 創建XML文件
  2. 使用XSD.EXE XSD生成一個序列化的類
  3. 使用XmlSerializer到XML序列化到一個類的實例
  4. 修改實例
  5. 使用XmlSerializer序列化回XML

另一種選擇是爲三個派生類創建一個基類。這樣,列表仍然可以序列化其內容作爲其派生類型。但是,串行器將序列化類型信息。

+0

謝謝Aphelion,如果選擇2,XSD仍然需要? – LIU

+0

不知何故串行器應該知道如何序列化。您可以使用XML序列化屬性手動創建類,也可以使用XSD工具根據XSD爲您創建它們。 – Aphelion

0

,你可以用這個例子

using (XmlTextReader xmlReader = new XmlTextReader(your file.xml)) 
     { 
      XDocument xdoc = XDocument.Load(xmlReader); 
      var programs= from programItem in xdoc.Root.Elements() 
         select new yourclass { 
      Id = Convert.ToInt32(programItem.Attribute("Id").Value), 
      value1 = programItem.Attribute("value1").Value, 
      value2 = programItem.Attribute("value2").Value 
     }; 

     result = programs.ToList(); 
    } 
0

試試這個:

ViewModelSerializer viewModelData = ViewModelSerializer.Deserialize(path); 
      foreach(ViewModelBase view in viewModelData.Views) { 
       WidgetList.Add(view); 
      } 

viewModelBase.cs文件

/// <summary> 
    /// Provides common functionality for ViewModel classes 
    /// </summary> 
    public abstract class ViewModelBase : INotifyPropertyChanged, IMVVMDockingProperties 
    { 
     #region Data 

     public event PropertyChangedEventHandler PropertyChanged; 

     #endregion // Data 

     #region Protected Methods 

     /// <summary> 
     /// Raises event property changed. 
     /// </summary> 
     /// <param name="propertyName">An property expression representation.</param> 
     protected void OnPropertyChanged<T>(Expression<Func<T>> action) 
     { 
      var propertyName = GetPropertyName(action); 
      OnPropertyChanged(propertyName); 
     } 

     /// <summary> 
     /// Raises event property changed. 
     /// </summary> 
     /// <param name="propertyName">A property name.</param> 
     protected void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     /// <summary> 
     /// Helper to set dependency property value. 
     /// </summary> 
     /// <typeparam name="T">Property type</typeparam> 
     /// <param name="target">Target Dependency property</param> 
     /// <param name="value">Value to set</param> 
     /// <param name="changedProperties">argument list on changed property names we going notify about notify</param> 
     /// <returns></returns> 
     protected virtual bool SetValue<T>(ref T target, T value, params string[] changedProperties) 
     { 
      if (Object.Equals(target, value)) 
      { 
       return false; // no changes, same value 
      } 

      target = value; 

      foreach (string property in changedProperties) 
      { 
       OnPropertyChanged(property); 
      } 

      return true; 
     } 

     #endregion // Protected Methods 

     #region Private Methods 

     /// <summary> 
     /// Helper method to get Property name from Expression. 
     /// </summary> 
     /// <typeparam name="T">Generic type.</typeparam> 
     /// <param name="action">Expression.</param> 
     /// <returns>A property name.</returns> 
     private static string GetPropertyName<T>(Expression<Func<T>> action) 
     { 
      var expression = (MemberExpression)action.Body; 
      var propertyName = expression.Member.Name; 
      return propertyName; 
     } 

     #endregion // Private Methods 

     #region IMVVMDockingProperties Members 

     public string TargetName { get; set; } 

     #endregion 
    } 
}