0

XML から List<> にデータを読み取る必要があります。XML ファイルには、次の 3 つのテーブル形式の 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);

このようにして、3 つのデータテーブルが dsprofile で自動的に作成されます。リストをコンテナーとして使用して、XML ファイル データを保存するにはどうすればよいですか? テーブル形式が1つだけの場合、私はそれを行うことができます:

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

ただし、ファイルには 3 種類のテーブルがあります。List<> を使用したい場合はどうすればよいですか?

よろしくお願いします。

4

3 に答える 3

1

あなたのアプローチはあまり安全ではないと思います。次のようにして、すべてを強い型で定義するように選択できます。

  1. XMLファイルのXSDを作成します
  2. XSD.EXEを使用して、シリアル化可能なクラスを生成します
  3. XmlSerializerXMLをクラスインスタンスに逆シリアル化するために使用します
  4. インスタンスを変更します
  5. XmlSerializerXMLにシリアル化するために使用します

もう1つのオプションは、3つの派生クラスの基本クラスを作成することです。そうすれば、リストはその内容を派生型としてシリアル化できます。ただし、シリアライザーはタイプ情報をシリアル化します。

于 2012-06-20T07:47:07.323 に答える
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
    }
}
于 2015-07-16T13:07:05.320 に答える