1. 程式人生 > >序列化和LINQ to XML處理XML

序列化和LINQ to XML處理XML

整理了兩種讀寫XML檔案的方法:序列化和LINQ to XML。WPF寫了個簡單的例子。


1,MainWindow.xaml原始碼

<Window x:Class="XmlDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="241" Width="388">
    <Grid>
        <Button Content="載入" HorizontalAlignment="Left" Margin="56,49,0,0" VerticalAlignment="Top" Width="87" Height="39"  Click="Button_Click_1"/>
        <Button Content="儲存" HorizontalAlignment="Left" Margin="215,49,0,0" VerticalAlignment="Top" Width="88" Height="39" Click="Button_Click_2"/>
        <Button Content="載入" HorizontalAlignment="Left" Margin="56,144,0,0" VerticalAlignment="Top" Width="87" Height="37" Click="Button_Click_3"/>
        <Button Content="儲存" HorizontalAlignment="Left" Margin="215,144,0,0" VerticalAlignment="Top" Width="88" Height="37" Click="Button_Click_4"/>
        <Label Content="序列化和反序列化方式" HorizontalAlignment="Left" Margin="56,10,0,0" VerticalAlignment="Top"/>
        <Label Content="LINQ to XML 方式" HorizontalAlignment="Left" Margin="56,103,0,0" VerticalAlignment="Top"/>

    </Grid>
</Window>
2,MainWindow.xaml.cs後臺程式碼
    /// <summary>
    /// MainWindow.xaml 的互動邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        private ClassDemo demo = new ClassDemo();

        public MainWindow()
        {
            InitializeComponent();

            demo.Name = "myname";
            demo.Members = new List<string> { "成員一", "成員二" };

            demo.Children = new List<ClassChild>{
                                   new ClassChild(){ID="1",Name="Child 1"},
                                   new ClassChild(){ID="2",Name="Child 2"}};
        }

        /// <summary>
        /// 反序列化載入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(ClassDemo));
            StreamReader sr=null;

            try
            {
                sr = new StreamReader("XmlDemo.xml");
                ClassDemo item = serializer.Deserialize(sr) as ClassDemo;

                MessageBox.Show("載入成功!");
            }
            catch (Exception)
            {
                MessageBox.Show("如果檔案不存在,請先儲存!");
            }
            finally
            {
                if (sr != null)
                    sr.Close();
            }

        }

        /// <summary>
        /// 序列化儲存
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(ClassDemo));
            StreamWriter sw = null;

            try
            {
                sw = new StreamWriter("XmlDemo.xml");
                serializer.Serialize(sw, demo);

                MessageBox.Show("儲存成功!");
            }
            catch (Exception)
            {

            }
            finally
            {
                if (sw != null)
                {
                    sw.Close();
                }
            }
        }

        /// <summary>
        /// Linq方式載入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_3(object sender, RoutedEventArgs e)
        {
            //ClassDemo作為根節點會出現找不到的情況,所以加了個Config根節點
            List<ClassDemo> _demo = (from item in XElement.Load("XmlDemo2.xml").Elements("ClassDemo")                        
                         select new ClassDemo()
                         {
                             Name = item.Element("Name").Value,
                             Members = (from mem in item.Element("Members").Elements() select mem.Value).ToList(),
                             Children = (from child in item.Element("Children").Elements()
                                         select new ClassChild()
                                         {
                                             ID = child.Element("ID").Value,
                                             Name = child.Element("Name").Value
                                         }).ToList()
                         }
                         ).ToList();

            MessageBox.Show("載入成功!");
        }

        /// <summary>
        /// Linq方式儲存
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_4(object sender, RoutedEventArgs e)
        {
            XElement doc=new XElement("Config",new XElement("ClassDemo",
                                new XElement("Name",demo.Name),
                                new XElement("Members",from c in demo.Members 
                                                       select new XElement("string",c)),
                                new XElement("Children",from d in demo.Children
                                                        select new XElement("ClassChild",
                                                            new XElement("ID",d.ID),
                                                            new XElement("Name",d.Name)))));
            doc.Save("XmlDemo2.xml");
            MessageBox.Show("儲存成功!");
        }
    }

原始碼下載