zoukankan      html  css  js  c++  java
  • 实用的WPF Xml的简易读写类以及用法示例

    转自:http://www.silverlightchina.net/html/study/WPF/2012/0808/17980.html

    最近真是写博客写的不可收拾,今天再来一篇.

      因为做一些程序频繁的要使用Xml,因此要频繁的写Xml读写类,这不,索性写两个通用类,把它们包装在Dll中,实现了简化Xml操作操作的目的.

      现公布Xml读取和写入代码.我记得在最新的一篇博客中也提到了Xml的读取代码,这个读取代码就是以那个作为基础,更加通用,由于只是我自个测试的,难免有不完善之处,希望大家能给我指出来,我继续改进.

      Xml读取类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml;
    
    namespace XmlReaderAndWriter
    {
         public   class XmlReader
        {
            private static XmlDocument doc=new XmlDocument();
            private static string  fileurl;
            //文件路径
             public static  string 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 attr, 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 attr, string compare)
            {
                foreach (XmlNode cxn in xn.ChildNodes)
                {
                    if (GetXmlNodeByArrtibute(cxn, attr, compare))
                    {
                        return cxn;
                    }
                }
                return null;
            }
        }
    }



    Xml写入类:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml;
    
    namespace XmlReaderAndWriter
    {
        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);  
           }
        }
    }



    关于Xml声明节点的创建方法,加入了一个是否有根节点(即XmlDocument中是否有子节点,因为只允许有一个根节点)判断,这是因为必须要在根节点创建之前创建声明节点,否则会提示出错.此判断可以解决这个问题,无论何时添加Xml声明节点都可以,而解决的方法就是将根节点移到声明节点的后边,具体鉴代码.

      如果大家仔细阅读的话相信不久就能够掌握,为了大家更好地理解特奉上一个读写示例(简单的 ),

      下边是xml读写的示例:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using XmlReaderAndWriter;
    namespace XmlTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.Write("选择读取写入操作(W/R):");
                string s=Console.ReadLine();
                if (s == "W")
                {
                    WriteXml();
                }
                else if (s == "R")
                {
                    if(!File.Exists("xml.xml"))
                   {
                       Console.WriteLine("您还未写入呢");
                       Main(null);
                    }
                  ReadXml();
                }
                else
                {
                    Console.Write("请重新选择");
    
                }
                Console.WriteLine("完成,按任意键继续");
                Console.ReadKey();
                Main(null);
    
    
            }
            static void  WriteXml()
            {
    
                System.Xml.XmlElement root = XmlWriter.CreateRootElement("Countries");
                string[] countrys = new string[] { "中国", "美国", "俄罗斯" };
                for (int i = 0; i < countrys.Count(); i++)
                {
                    System.Xml.XmlNode country = XmlWriter.CreateElement("Country", countrys[i]);
                    XmlWriter.AppendAttributeToElement((System.Xml.XmlElement)country, "Name", countrys[i]);
                    XmlWriter.AppendChild(root, country);
                  //  XmlWriter.RemoveXmlAttribute(country, "Name"); 
    
                }
                XmlWriter.CreateXmlDeclaration("1.0", "UTF-8", null);
                XmlWriter.SavaXml("xml.xml");
            }
            static void ReadXml()
            {
                XmlReader.LoadXml("xml.xml");
                System.Xml.XmlElement xe = XmlReader.GetXmlDocumentRoot();
                System.Xml.XmlNode xn = XmlReader.ExchangeNodeElement(xe);
                string s = XmlReader.GetXmlChildNodeByAttrtibute(xe, "Name", "中国").InnerText;
                Console.WriteLine(s);
            }
        }
    }

      怎么样,是不是写入xml变得方便多了?(没加注释,因为很简单)此示例中特意将声明节点放在后边,也是可以正常运行的。

     
  • 相关阅读:
    微信小程序开发教程目录
    Head First设计模式之目录
    CentOS安装NodeJS
    docker镜像打包
    .net core 2.2部署到Windows Server 2012 R2 standard
    MySQL job/定时任务/event 学习
    “sgen.exe”未能运行。文件名或扩展名太长
    Linux 服务器如何设置文件和文件夹的读写权限
    添加“Git Bash Here”到右键菜单
    .Net Core中文编码问题
  • 原文地址:https://www.cnblogs.com/hnfxs/p/3216639.html
Copyright © 2011-2022 走看看