2012-06-20 35 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 
    } 
}