序列化和LINQ to XML處理XML
阿新 • • 發佈:2019-01-07
整理了兩種讀寫XML檔案的方法:序列化和LINQ to XML。WPF寫了個簡單的例子。
1,MainWindow.xaml原始碼
2,MainWindow.xaml.cs後臺程式碼<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>
/// <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("儲存成功!"); } }