XML文档操作集锦(C#篇)
在JSON没流行起来的时候xml一直作为程序存储配置信息的主流介质;特别是小型数据表方面还是不错的选择,所以经常涉及到的操作无非也就是增删改查,这篇博客主要是对这些对比较常用的操作做了个简单的总结
文件加载
SelectNodes()、SelectSingleNode()节点获取大法
创建XML文档及设置元素值
XmlReader与XmlWriter
DataSet与XML数据
Linq to XML
XML序列化与反序列化
文件加载
- 通过路径加载XML
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);//文件路径或者URL地址
Console.WriteLine(xmlDoc.InnerXml);
Console.WriteLine("==============有逼格的分割线================");
xmlDoc.Load("http://feed.cnblogs.com/blog/picked/rss");//博客园精华帖RSS
Console.WriteLine(xmlDoc.InnerXml);
- 通过文件流加载
using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(stream);
Console.WriteLine(xmlDoc.InnerXml);
}
Load()方法还重载了一些方法,并且还有别的方式可以加载XML文档,比如LoadXml()直接加载一段XML串
SelectNodes()、SelectSingleNode()节点获取大法
<?xml version="1.0" encoding="utf-8" ?>
<Names>
<Name>
<FirstName>John</FirstName>
<LastName>Smith</LastName>
</Name>
<Name>
<FirstName>James</FirstName>
<LastName>White</LastName>
</Name>
</Names>
XML文件
- 通过XPath表达式的SelectNodes(string xpath)方法获取节点列表;SelectSingleNode(string xpath)获取第一个匹配的节点
XmlNodeList xmlNodes = xmlDoc.SelectNodes("/Names/Name");//第一个斜杠必须是根节点
foreach (XmlNode item in xmlNodes)
{
Console.WriteLine(item.InnerXml);
}
Console.WriteLine("==================================");
XmlNode xmlNode = xmlDoc.SelectSingleNode("/Names/Name");
Console.WriteLine(xmlNode.InnerXml);
Console.WriteLine(xmlNode["LastName"].InnerText);//获取子节点
- 设置节点特性值查找节点
<Root> <Item Id="1" Grade="1">张三</Item> <Item Id="2" Grade="1">李四</Item> <Item Id="3" Grade="2">王五</Item> <Item Id="4" Grade="3">赵六</Item> </Root>
XmlNodeList xmlNodes = xmlDoc.SelectNodes("/Root/Item[@Grade='1']");//XPath表达式获取设置要获取节点的特性值信息
foreach (XmlNode item in xmlNodes)
{
Console.WriteLine(item.InnerText);
}
- 获取第N个节点
XmlNode xmlNode = xmlDoc.SelectSingleNode("/Root/Item[position()=3]");//获取第N个节点(根据XML节点的顺序)
Console.WriteLine(xmlNode.InnerText);
Console.WriteLine("==============================");
XmlNodeList xmlNodes = xmlDoc.SelectNodes("/Root/Item[position()<=3]");//获取从第一个到第N个的节点(根据XML节点的顺序
foreach (XmlNode item in xmlNodes)
{
Console.WriteLine(item.InnerText);
}
Console.WriteLine("==============================");
xmlNodes = xmlDoc.SelectNodes("/Root/Item[position() > 2]");//获取大于第N个的节点(根据XML节点的顺序)
foreach (XmlNode item in xmlNodes)
{
Console.WriteLine(item.InnerText);
}
创建XML文档及设置元素值
XmlDocument xmlDoc = new XmlDocument();
XmlNode rootNode = xmlDoc.CreateElement("Root");//创建一个节点
xmlDoc.AppendChild(rootNode);
Console.WriteLine(xmlDoc.InnerXml);
Console.WriteLine("==============有逼格的分割线================");
XmlNode node = xmlDoc.CreateElement("Item");
XmlAttribute attribute = xmlDoc.CreateAttribute("Id");//创建节点特性
attribute.Value = ";//设置特性值
node.Attributes.Append(attribute);
node.InnerText = "张三";
rootNode.AppendChild(node);
Console.WriteLine(xmlDoc.InnerXml);
Console.WriteLine("==============有逼格的分割线================");
node = xmlDoc.CreateElement("Item");
attribute = xmlDoc.CreateAttribute("Id");
attribute.Value = ";
node.Attributes.Append(attribute);
node.InnerText = "李四";
rootNode.AppendChild(node);
Console.WriteLine(xmlDoc.InnerXml); xmlDoc.Save(fileName);//保存到文件
XmlReader与XmlWriter
XmlReader操作XML比XmlDocument更快、内存消耗更少(可以写一个测试验证一下);但是它需要去手动判断元素的类型,操作起来比XmlDocument稍微蛋疼一些
using (XmlWriter xmlWriter = XmlWriter.Create(fileName))
{
xmlWriter.WriteStartDocument();//开始写入xml文档
xmlWriter.WriteStartElement("users");
xmlWriter.WriteStartElement("user");
xmlWriter.WriteAttributeString(");
xmlWriter.WriteString("张三");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("user");
xmlWriter.WriteAttributeString(");
xmlWriter.WriteString("李四");
xmlWriter.WriteEndDocument();//结束写入xml文档
}
using (XmlReader xmlReader = XmlReader.Create(fileName))
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)//元素的类型
{
Console.WriteLine(xmlReader.Name);//元素名称
if (xmlReader.HasAttributes)
{
Console.WriteLine(xmlReader.GetAttribute("Id"));//元素名称
}
Console.WriteLine(xmlReader.ReadOuterXml());//获取节点的所有子内容
}
}
}
DataSet与XML数据
通过XmlReader将数据读入到DataSet数据集中
using (XmlReader xmlReader = XmlReader.Create(fileName, new XmlReaderSettings()))
{
DataSet ds = new DataSet();
ds.ReadXml(xmlReader);
DataTable dt = ds.Tables[];
; i < dt.Rows.Count - ; i++)
{
object[] items = dt.Rows[i].ItemArray;
Console.WriteLine(string.Join(" ", items));
}
}
将数据表保存到XML文件也是比较常用的
DataSet ds = new DataSet();
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Id", Type.GetType("System.Int32")));
dt.Columns.Add(new DataColumn("Grade", Type.GetType("System.Int32")));
dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String")));
DataRow dr = dt.NewRow();
dr[;
dr[;
dr["Name"] = "孙七";
dt.Rows.Add(dr);
ds.Tables.Add(dt);
ds.Tables[].TableName = "Student";//每张表为根节点下的第一个子节点
ds.WriteXml(fileName);
Linq to XML
通过linq操作XML上手快、操作方便
//查询
XDocument xdoc = XDocument.Load(fileName);
var query = from item in xdoc.Descendants("Item")
select new { Id = item.Attribute("Id").Value, Name = item.Value };
foreach (var item in query)
{
Console.WriteLine(item.Id + " " + item.Name);
}
//添加
XDocument xdoc = XDocument.Load(fileName);
XElement xele = new XElement("Item","吴十?");//创建节点
xele.SetAttributeValue();//设置节点特性值
xdoc.Element("Root").Add(xele);
xdoc.Save(fileName);
//删除
XDocument xdoc = XDocument.Load(fileName);
XElement xele = xdoc.Descendants(")).FirstOrDefault();
xele.Remove();
xdoc.Save(fileName);
//修改
XDocument xdoc = XDocument.Load(fileName);
XElement xele = xdoc.Descendants(")).FirstOrDefault();
xele.Value = "流年";
xdoc.Save(fileName);
XML序列化与反序列化
//序列化 , Grade = , Name = "王五" }; XmlSerializer serializer = new XmlSerializer(typeof(Student)); serializer.Serialize(Console.Out, student);
//反序列化
string input = "<?xml version=\"1.0\" encoding=\"gb2312\"?><student><Id> 1 </Id><Grade> 2 </Grade><Name> 李四 </Name></student>";
using (StringReader sr = new StringReader(input))
{
XmlSerializer serializer = new XmlSerializer(typeof(Student));
Student student = (Student)serializer.Deserialize(sr);
Console.WriteLine(student.Name);
}
扩展阅读
http://www.dotnetcurry.com/linq/564/linq-to-xml-tutorials-examples
http://www.tutorialspoint.com/linq/linq_xml.htm
https://msdn.microsoft.com/en-us/library/mt693062.aspx
http://broadcast.oreilly.com/2010/10/understanding-c-simple-linq-to.html
http://www.codeproject.com/Articles/24376/LINQ-to-XML
http://csharp.net-tutorials.com/xml/reading-xml-with-the-xmlreader-class/
https://msdn.microsoft.com/zh-cn/library/58a18dwa(v=vs.120).aspx
http://csharp.net-informations.com/xml/xml-de-serialization.htm
XML文档操作集锦(C#篇)的更多相关文章
- XML文档操作之JAXP下实现
JAXP是java API for xml PRocessing的缩写. 其API可以在javax.xml.parsers 这个包中找到.这个包向用户提供了两个最重要的工厂类,SAXParserFac ...
- 关于XML文档操作类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...
- xml文档操作
/** * */package com.gootrip.util; import java.io.ByteArrayOutputStream;import java.io.File;import ja ...
- C#XmlHelper帮助类操作Xml文档的通用方法汇总
前言 该篇文章主要总结的是自己平时工作中使用频率比较高的Xml文档操作的一些常用方法和收集网上写的比较好的一些通用Xml文档操作的方法(主要包括Xml序列化和反序列化,Xml文件读取,Xml文档节点内 ...
- 用ORM的思想操作XML文档,一个对象就搞定不要太简单。滚蛋吧!XmlDocument、XmlNode、Xml***……
大家有没有这样的感受,一涉及XML文档操作就得百度一遍.是不是非!常!烦!.各种类型,各种方法,更别提为了找到一个节点多费劲.本来想写个XML操作的工具方法,写了两行一想既然XML文档是有规律的,如果 ...
- XMLHelper类 源码(XML文档帮助类,静态方法,实现对XML文档的创建,及节点和属性的增、删、改、查)
以下是代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...
- 【XML】利用Dom4j读取XML文档以及写入XML文档
Dom4j简介 dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它的性能 ...
- 【JAVA与DOM4J实现对XML文档的CRUD操作】
一.简介 1.网上下载DOM4J 1.6.1压缩包,解压开之后,发现几个目录和一个jar文件,jar文件是必须的文件其它目录: docs目录:帮助文档的目录,单击index.html: Quick s ...
- C#操作XML文档---基础
增查改删代码如下 public void CreateXML() { XmlDocument xml = new XmlDocument(); xml.AppendChild(xml.CreateXm ...
随机推荐
- Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序
1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...
- RPC 的概念模型与实现解析
今天分布式应用.云计算.微服务大行其道,作为其技术基石之一的 RPC 你了解多少?一篇 RPC 的技术总结文章,数了下 5k+ 字,略长,可能也不适合休闲的碎片化时间阅读,可以先收藏抽空再细读:) 全 ...
- [Voice communications] 声道的转换
本系列文章主要是介绍 Web Audio API 的相关知识,以及 web语音通信 中会遇到的一些问题,阐述可能存在错误,还请多多斧正! 很多粤语剧都提供了两个声道,一个左声道为粤语,一个右声道有国语 ...
- 《App研发录》 源码
第1章源码: 1.1 重新规划Android项目结构 1.1.zip 1.2 为Activity定义新的生命周期 1.2.zip 1.3 统一事件编程模型 1.3.zip 1.4 实体化编程 1.4. ...
- JSON Web Token实际应用
一.JWT认证方式的实现方式 1.客户端不需要持有密钥,由服务端通过密钥生成Token. 2.客户端登录时通过账号和密码到服务端进行认证,认证通过后,服务端通过持有的密钥生成Token,Token中一 ...
- 有关bootstrap之排版
1.标题 HTML中的所有标题标签,从<h1> 到 <h6> 均可用.另外,还提供了.h1 到.h6 class,为的是给inline属性的文本赋予标题的样式. 在标题内还可以 ...
- PDO 数据访问抽象层
1.操作其它数据库 (1)造对象 $dsn = "mysql:dbname=test3;host=localhost"; //数据源:两个参数:数据库驱动,链接数据库 $pdo = ...
- C#设计模式-装饰者模式
在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).Access ...
- 浅谈HTML5单页面架构(一)——requirejs + angular + angular-route
心血来潮,打算结合实际开发的经验,浅谈一下HTML5单页面App或网页的架构. 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又要数单页面架构体验 ...
- 编译异常 Caused by: java.lang.UnsupportedClassVersionError:
Caused by: java.lang.UnsupportedClassVersionError: com/sumingk/platform/service/impl/ServiceSysPerso ...