转自: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 == )
{
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 - )
{
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 == )
{
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 = ; 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变得方便多了?(没加注释,因为很简单)此示例中特意将声明节点放在后边,也是可以正常运行的。

 

实用的WPF Xml的简易读写类以及用法示例的更多相关文章

  1. PHP实现的多文件上传类及用法示例

    这篇文章主要介绍了PHP实现的多文件上传类及用法,详细分析了php实现的多文件上传类与具体的使用技巧,需要的朋友可以参考下 1.upFiles.css.php 文件 <?php class Up ...

  2. java Class类的用法示例

    @SuppressWarnings("unchecked") public void func() throws InstantiationException, IllegalAc ...

  3. C#中读写Xml配置文件常用方法工具类

    场景 有时需要使用配置文件保存一些配置的属性,使其在下次打开时设置仍然生效. 这里以对xml配置文件的读写为例. 1.读取XML配置文. 2.写入XML配置文件. 3.匹配 XPath 表达式的第一个 ...

  4. C#读取XML文件的基类实现

    刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...

  5. XML文件与实体类的互相转换

    XML文件与实体类的互相转换 一.将XML文件反序列化为实体类对象 1. 通常程序的配置信息都保存在程序或者网站的专门的配置文件中(App.config/web.config).但是现在为了演示XML ...

  6. Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布

    Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布 摘要: jeasypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导 ...

  7. QT学习之文件系统读写类

    #QT学习之文件系统读写类 QIODevice QFileDevice QBuffer QProcess 和 QProcessEnvironment QFileDevice QFile QFileIn ...

  8. 2017.12.20 Java中的 IO/XML学习总结 File类详细

    IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...

  9. .NET下XML文件的读写

    一.前言: XML是微软.Net战略的一个重要组成部分,而且它可谓是XML Web服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了.本文将指导大家如何运用C#语言完成.Net框架下的X ...

随机推荐

  1. Event 讲解

    应用场景:某件事发生时,需要采取多步的动作,此时就用到了 使用方法:创建event方法一,使用命令 make:event  生成事件在app/Events目录下,命令make:listener 生成监 ...

  2. 用excel处理重复数据

    我们在处理数据时,重复数据常常会对分析造成很大麻烦,因此数据整理初期一个重要的工作是排重,excel2007以上版本中有一个删除重复项功常便捷,但是每次点来点去也很麻烦,下面我们用公式来对一些重复数据 ...

  3. [saiku] 通过 saiku 的 DEMO 分析 connection

    示例:FOODMART connection: foodmart catalog: FoodMart schema: FoodMart cube: Sales/HR/Sales 2/.../ ==== ...

  4. ubuntu14 eclipse luna 无法显示菜单 , 解决方案

    使用命令行 , 输入 Exec=env UBUNTU_MENUPROXY=0 <eclipse的安装路径>/eclipse 就可以了 或者建立一个Eclipse的快捷方式,eclipse. ...

  5. thinkphp @代表什么

    import('@.ORG.Util.RBAC'); @表示在同一目录下.看一下Lib目录下除了Action外,还有ORG目录.如果使用@.ORG.Util.RBAC,则表示RBAC是放在Lib/OR ...

  6. URL和搜索引擎优化

    URL要短:谷歌的算法是给5个以后的单词更少的权重 URL不含和少含问号:防止死循环 小写字母:搜索引擎遵守HTTP规范,区分大小写.

  7. UI-popup

    做CRM有些时间了,可是对于UI却接触的不是很多,不过感觉UI和DYNPRO差不多...很类似的,...呵呵.加油吧! LV_TITLE = TEXT-T07.”POPUP TITLE   LV_PO ...

  8. guava学习--Optional可空类型

    转载:http://www.cnblogs.com/whitewolf/p/4231783.html Null sucks 回到本文主题Optional.在我日常编程中NullPointerExcep ...

  9. 测试JdbcTemplate执行SQL语句和存储过程

    我在项目中需要使用到oracle的语句片段和存储过程.下面就是我的测试案例: public class DbTest extends BaseTestCase { @Resource JdbcUtil ...

  10. 创建论坛Discuz

    下载discuz! mkdir /data/wwwcd /data/wwwwget  http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GB ...