实用的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 == )
{
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的简易读写类以及用法示例的更多相关文章
- PHP实现的多文件上传类及用法示例
这篇文章主要介绍了PHP实现的多文件上传类及用法,详细分析了php实现的多文件上传类与具体的使用技巧,需要的朋友可以参考下 1.upFiles.css.php 文件 <?php class Up ...
- java Class类的用法示例
@SuppressWarnings("unchecked") public void func() throws InstantiationException, IllegalAc ...
- C#中读写Xml配置文件常用方法工具类
场景 有时需要使用配置文件保存一些配置的属性,使其在下次打开时设置仍然生效. 这里以对xml配置文件的读写为例. 1.读取XML配置文. 2.写入XML配置文件. 3.匹配 XPath 表达式的第一个 ...
- C#读取XML文件的基类实现
刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...
- XML文件与实体类的互相转换
XML文件与实体类的互相转换 一.将XML文件反序列化为实体类对象 1. 通常程序的配置信息都保存在程序或者网站的专门的配置文件中(App.config/web.config).但是现在为了演示XML ...
- Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布
Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布 摘要: jeasypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导 ...
- QT学习之文件系统读写类
#QT学习之文件系统读写类 QIODevice QFileDevice QBuffer QProcess 和 QProcessEnvironment QFileDevice QFile QFileIn ...
- 2017.12.20 Java中的 IO/XML学习总结 File类详细
IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...
- .NET下XML文件的读写
一.前言: XML是微软.Net战略的一个重要组成部分,而且它可谓是XML Web服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了.本文将指导大家如何运用C#语言完成.Net框架下的X ...
随机推荐
- 【bzoj1037】生日聚会
bzoj1037 题意 \(n\)个男孩,\(m\)个女孩,共\(n+m\)个排成一排. 要求对于任意连续的一段,男孩与女孩的数目之差不超过\(k\). 求排列的方案数. \(1\leq n,m\le ...
- jmeter 构建一个FTP测试计划
添加用户 第一步你想做的每一个JMeter测试计划是添加一个 线程组 元素. 线程组告诉 JMeter的用户数量你想模拟,用户应该发送的次数 请求,他们应该发送的请求的数量. 继续添加线程组元素首先选 ...
- Shell基础:Linux权限管理
Linux权限基本概念 查看系统(文件夹/文件)权限: ls -l =>d/- xxx xxx xxx. num owner group size date filename ...
- (18)odoo规范
* 约定 # 命名会用 蛇形式或驼峰式 todo_task_stage 蛇形式 class TodoTask 驼峰式 变量名还是蛇形居多, 类名和方法名驼 ...
- Java 基础知识点(必知必会其一)
如何将字符串转换为数字? package Day_2; /** * @author Administrator * 功能: 如何将字符串转换为数字? */ public class StringToI ...
- 在VS2010中,引用了同一解决方案的另一个项目的dll,却不能正常调用(转)
目前发现的原因是,dll的.net 版本比我的程序的高 dll用的.net 4 而程序用的.net 4 client profile 转载源:http://www.cnblogs.com/szyic ...
- WCF学习笔记
1,关于WCF/web service/WSE Web Service:是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架,也不是技术.它有一套完成的规范体系标准,而且在持 ...
- SVN clean up问题
问题如截图所示: 解决方法:在根目录clean up,注意把所有的选项都勾上
- Linux查看程序端口占用情况【转】
今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占用. 使用命令: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat ...
- 李明杰视频 SVN
李明杰视频 SVN 就10-12使用技术SVN 源代码会引发哪些问题? 无法后悔:做错一个操作 版本备份:费控件,费时间 版本混乱:因版本备份太多造成混乱 代码冲突:多人操作同一文件 强烈建议 使用源 ...