WPF 讀寫XML檔案
阿新 • • 發佈:2020-04-27
程式集整體框架如下:
其中XmlReader類如下:
using System; using System.Collections.Generic; using System.Text; using System.Xml; namespace WpfApp4 { public class XmlReader { private static XmlDocument doc = new XmlDocument(); private static string fileurl; //檔案路徑 public staticXmlReader.csstring FileUrl { set { fileurl = value; } get { return fileurl; } } /// <summary> /// 載入Xml檔案 /// </summary> /// <param name="url">Xml檔案路徑</param> public static void LoadXml(string url) { doc.Load(url); }/// <summary> /// 獲取XmlDocument的根節點 /// </summary> /// <returns>返回的XmlElement元素根節點</returns> public static XmlElement GetXmlDocumentRoot() { return doc.DocumentElement; } /// <summary> /// 獲取指定元素的指定Attribute值/// </summary> /// <param name="xe">表示一個XmlElement</param> /// <param name="attr">表示Attribute的名字</param> /// <returns>返回獲取的Attribute的值</returns> public static string GetAttribute(XmlElement xe,string attr) { return xe.GetAttribute(attr); } /// <summary> /// 獲取指定節點的指定Attribute值 /// </summary> /// <param name="xn">表示一個XmlNode</param> /// <param name="attr"></param> /// <returns>返回獲取的Attribute的值</returns> public static string GetAttribute(XmlNode xn,string attr) { XmlElement xe = ExchangeNodeElement(xn); return xe.GetAttribute(attr); } /// <summary> /// XmlElement物件轉換成XmlNode物件 /// </summary> /// <param name="xe">XmlElement物件</param> /// <returns>返回XmlNode物件</returns> public static XmlNode ExchangeNodeElement(XmlElement xe) { return (XmlNode)xe; } /// <summary> /// XmlNode物件轉換成XmlElement物件 /// </summary> /// <param name="xe">XmlNode物件</param> /// <returns>返回XmlElement物件</returns> public static XmlElement ExchangeNodeElement(XmlNode xn) { return (XmlElement)xn; } /// <summary> /// 獲取節點的文字 /// </summary> /// <param name="xn"></param> /// <param name="nodename">節點的名稱</param> /// <returns></returns> public static string GetXmlNodeInnerText(XmlNode xn,string nodename) { XmlNode childxn = xn.SelectSingleNode(nodename); return childxn.InnerText; } /// <summary> /// 獲取指定節點的子節點 /// </summary> /// <param name="xn">節點物件</param> /// <returns>返回子節點數</returns> public static int GetXmlNodeCount(XmlNode xn) { return xn.ChildNodes.Count; } /// <summary> /// 獲取元素的文字 /// </summary> /// <param name="xn">XmlElement元素</param> /// <param name="nodename">元素的名稱</param> /// <returns></returns> public static string GetXmlElementInnerText(XmlElement xn,string nodename) { XmlNode childxn = xn.SelectSingleNode(nodename); return childxn.InnerText; } /// <summary> /// 獲取XmlNode是否具有指定Attribute值 /// </summary> /// <param name="xn">XmlNode物件</param> /// <param name="attr">Attribute的名稱</param> /// <param name="compare">Attribute的值</param> /// <returns>返回bool值</returns> public static bool GetXmlNodeByArrtibute(XmlNode xn,string attr,string compare) { if (GetAttribute(xn,attr) == compare) { return true; } return false; } /// <summary> /// 獲取XmlElement是否具有指定Attribute值 /// </summary> /// <param name="xn">XmlElement物件</param> /// <param name="attr">Attribute的名稱</param> /// <param name="compare">Attribute的值</param> /// <returns>返回bool值</returns> public static bool GetXmlNodeByArrtibute(XmlElement xe,string compare) { if (GetAttribute(xe,compare) == attr) { return true; } return false; } /// <summary> /// 獲取一個具有指定Attrtibute的XmlNode子節點 /// </summary> /// <param name="xn">XmlNode物件</param> /// <param name="attr">Attrtibute的名稱</param> /// <param name="compare">Attrtibute的值</param> /// <returns>返回相應的子節點</returns> public static XmlNode GetXmlChildNodeByAttrtibute(XmlNode xn,string compare) { foreach (XmlNode cxn in xn.ChildNodes) { if (GetXmlNodeByArrtibute(cxn,attr,compare)) { return cxn; } } return null; } } }
XmlWriter類如下:
using System; using System.Collections.Generic; using System.Text; using System.Xml; namespace WpfApp4 { public class XmlWriter { static XmlDocument doc = new XmlDocument(); /// <summary> /// 建立根節點 /// </summary> /// <param name="xn">根節點的名稱</param> /// <returns>返回根節點</returns> public static XmlElement CreateRootElement(string xn) { XmlElement xe = doc.CreateElement(xn); doc.AppendChild(xe); return xe; } /// <summary> /// 新增一個Attribute到一個XmlElement元素 /// </summary> /// <param name="xe">被新增的XmlElement元素</param> /// <param name="attrname">Attribute的特證名</param> /// <param name="attrtext">Attribute的值</param> public static void AppendAttributeToElement(XmlElement xe,string attrname,string attrtext) { XmlAttribute xa = CreateAttribute(attrname,attrtext); xe.Attributes.Append(xa); } /// <summary> /// 新增一個Attribute到一個XmlElement元素 /// </summary> /// <param name="xe">被新增的XmlElement元素</param> /// <param name="attr">Attribute物件</param> public void AppendAttributeToElement(XmlElement xe,XmlAttribute attr) { XmlAttribute xa = attr; xe.Attributes.Append(xa); } /// <summary> /// 建立一個Attribute物件 /// </summary> /// <param name="attrname">Attribute的特證名</param> /// <param name="attrtext">Attribute的值</param> /// <returns>返回建立的Attribute物件</returns> public static XmlAttribute CreateAttribute(string attrname,string attrtext) { XmlAttribute xa = doc.CreateAttribute(attrname); xa.InnerText = attrtext; return xa; } /// <summary> /// 建立一個具有指定名稱和值的節點 /// </summary> /// <param name="name">XmlNode的名稱</param> /// <param name="text">XmlNode的值</param> /// <returns>返回XmlNode物件</returns> public static XmlNode CreateElement(string name,string text) { XmlNode xn = (XmlNode)doc.CreateElement(name); //建立具有指定名稱的元素並轉換成節點 xn.InnerText = text; //獲取節點中的Text 內容控制元件中的名字 return xn; } /// <summary> /// 新增新節點到舊節點之後 /// </summary> /// <param name="oldxn">舊節點</param> /// <param name="newxn">新節點</param> public static void XmlInsertAfter(XmlNode oldxn,XmlNode newxn) { XmlNode parent = oldxn.ParentNode; //獲取被新增節點的父節點 parent.InsertAfter(newxn,oldxn); //新增新節點到舊節點之後 } /// <summary> /// 新增新節點到舊節點之前 /// </summary> /// <param name="oldxn">舊節點</param> /// <param name="newxn">新節點</param> public static void XmlInsertBefore(XmlNode oldxn,XmlNode newxn) { XmlNode parent = oldxn.ParentNode; //獲取被新增節點的父節點 parent.InsertBefore(newxn,oldxn);//新增新節點到舊節點之前 } /// <summary> /// 新增子節點到指定節點中 /// </summary> /// <param name="parentnode">指定的父節點</param> /// <param name="childnode">要新增進的子節點</param> public static void AppendChild(XmlNode parentnode,XmlNode childnode) { parentnode.AppendChild(childnode); } /// <summary> /// 建立Xml檔案宣告節點,必須要呼叫此方法 /// </summary> /// <param name="version">版本號,必須為1.0</param> /// <param name="encoding">字元編碼</param> /// <param name="standalone">獨立特性的值</param> public static void CreateXmlDeclaration(string version,string encoding,string standalone) { XmlDeclaration xd; xd = doc.CreateXmlDeclaration(version,encoding,standalone); //建立宣告節點 if (doc.ChildNodes == null) //如果存在根節點 { doc.AppendChild(xd); //新增根節點 } else { XmlElement root = doc.DocumentElement; //獲取文件的根節點 doc.RemoveAll(); //移除所有節點 doc.AppendChild(xd); //新增宣告節點 doc.AppendChild(root); ///新增根節點 } } /// <summary> /// 移除指定的節點 /// </summary> /// <param name="childnode"></param> /// <returns>返回移除結果</returns> public static bool RemoveChildNode(XmlNode childnode) { try { XmlNode parentnode = childnode.ParentNode; //獲取父節點 parentnode.RemoveChild(childnode); //移除父節點下的指定子節點 return true; } catch { return false; } } /// <summary> /// 移除所有的節點 /// </summary> /// <param name="xmlnode">節點名稱</param> /// <returns></returns> public static bool RemoveChildAllNode(XmlNode xmlnode) { xmlnode.RemoveAll(); //移除所有節點 if (xmlnode.ChildNodes.Count == 0) { return true; } else { return false; } } /// <summary> /// 選擇具有指定名稱的一個節點 /// </summary> /// <param name="xn">父節點物件</param> /// <param name="xname">要查詢節點的Name</param> /// <returns>返回查詢結果</returns> public static XmlNode SelectSingleNode(XmlNode xn,string xname) { return xn.SelectSingleNode(xname); } /// <summary> /// 選擇具有指定名稱的多個節點 /// </summary> /// <param name="xn">父節點物件</param> /// <param name="xname">要查詢節點的Name</param> /// <returns>返回查詢結果</returns> public static XmlNodeList SelectNodes(XmlNode xn,string xname) { return xn.SelectNodes(xname); } /// <summary> /// 移除節點中指定的Attribute /// </summary> /// <param name="xn">XmlNode物件</param> /// <param name="xan">Attribute的名稱</param> /// <returns>返回移除結果</returns> public static bool RemoveXmlAttribute(XmlNode xn,string xan) { int ac = xn.Attributes.Count; XmlNode xmlnode = xn.Attributes.RemoveNamedItem(xan); if (xmlnode.Attributes.Count == ac - 1) { return true; } else { return false; } } /// <summary> /// 移除節點中所有的Attribute /// </summary> /// <param name="xn">XmlNode物件</param> /// <returns>返回移除結果</returns> public static bool RemoveXmlAttribute(XmlNode xn) { xn.Attributes.RemoveAll(); if (xn.Attributes.Count == 0) { return true; } else { return false; } } /// <summary> /// 替換節點的值 /// </summary> /// <param name="xn">XmlNode物件</param> /// <param name="text">新的XmlNode的值</param> public static void ReplaceText(XmlNode xn,string text) { xn.InnerText = text; } /// <summary> /// 替換指定節點 /// </summary> /// <param name="nxn">新節點</param> /// <param name="oxn">正在被替換的節點</param> /// <returns>返回新節點</returns> public static XmlNode ReplaceChild(XmlNode nxn,XmlNode oxn) { return doc.ReplaceChild(nxn,oxn); } /// <summary> /// 儲存Xml檔案 /// </summary> public static void SavaXml(string url) { doc.Save(url); } } }XmlWriter.cs
前臺MainWindow有兩個按鍵事件:建立xml(也是寫xml)和讀xml
<StackPanel> <Button Content="建立" Click="btnCreatXml"/> <Button Content="讀取" Click="btnReadXml"/> </StackPanel>MainWindow.xaml
後臺程式碼如下:
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Xml; namespace WpfApp4 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void AddCountryAttribute(XmlElement root,string country,string capital) { XmlNode node = XmlWriter.CreateElement("Country"," "); XmlWriter.AppendAttributeToElement((XmlElement)node,"名字",country); XmlWriter.AppendAttributeToElement((XmlElement)node,"首都",capital); XmlWriter.AppendChild(root,node); } private void btnCreatXml(object sender,RoutedEventArgs e) { try { XmlElement root = XmlWriter.CreateRootElement("國家"); AddCountryAttribute(root,"中國","北京");//增加第一項 AddCountryAttribute(root,"美國","華盛頓");//增加第二項 AddCountryAttribute(root,"俄羅斯","莫斯科");//增加第三項 AddCountryAttribute(root,"日本","東京");//增加第四項 XmlWriter.CreateXmlDeclaration("1.0","UTF-8",null); XmlWriter.SavaXml("xml.xml");//儲存 } catch (Exception exception) { MessageBox.Show(exception.Message); } } private void btnReadXml(object sender,RoutedEventArgs e) { try { XmlReader.LoadXml("xml.xml"); XmlElement xe = XmlReader.GetXmlDocumentRoot(); XmlNode xn = XmlReader.ExchangeNodeElement(xe); XmlNodeList xnl = xn.ChildNodes; XmlElement eCur = (XmlElement)xnl[0];//讀取第一項首都的屬性值 string str = eCur.GetAttribute("首都"); MessageBox.Show(str); } catch (Exception exception) { MessageBox.Show(exception.Message); } } } }MainWindow.xaml.cs
點選建立按鍵會在應用程式目錄中生成一個xml.xml檔案,內容如下
點選讀取會彈出一個內容框