.net学习笔记---xml操作及读写
一、XML文件操作中与.Net中对应的类
微软的.NET框架在System.xml命名空间提供了一系列的类用于Dom的实现。
以下给出XML文档的组成部分对应.NET中的类:
| XML文档组成部分 | 对应.net中的类 |
| 处理指令 | XmlProcessingInstruction |
| 专指元素节点 | XmlElement |
| 属性 | XmlAttribute |
| 文本节点 | XmlText |
| 节点 | XmlNode |
| 文档 | XmlDocument |
| XmlWriter 对象的特性 | XmlWriterSettings |
| 注释 | XmlComment |
二、Xml文档各种处理类
1、XmlNode节点类:包括元素节点、文本节点、属性节点等等。
这个类可以说是.Net Xml操作的根基,大部分Xml操作类都继承自此类。很多类都重写了该类的方法等。
这个类成员属性,方法都很多,但是都是非常简单的,无非是对Xml文档的添加,修改,查询,保存等操作。因此,直接通过看MSDN就足够:
XmlNode:http://msdn.microsoft.com/zh-cn/library/system.xml.xmlnode_members(v=vs.80).aspx
另外,基本上,所有类都继承于此类,都大同小异。
2、XmlElement继承了XmlNode,专指元素节点。
XmlElement的特点:
- XmlElement继承自XmlLinkedNode又继承自XmlNode类。
- XmlElement专指元素节点,Xml节点有多种类型:属性节点、注释节点、文本节点、元素节点等。也就是XmlNode是这多种节点的统称。
- XmlElement是具现类,可以直接实例化,而XmlNode是抽象类,必须通过XmlDocument的某些方法返回。
本处仅仅写个最简单的示例:
示例Xml文档:
<?xml version="1.0" encoding="gb2312" ?>
<Article>
<author age="30">张三</author>
<length>12000</length>
<price>42</price>
</Article>
简单示例:

static void Main(string[] args)
{
//XmlDocument
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\Articles.xml"); //XmlNode出场
XmlNode node = doc.SelectSingleNode("Article");
string author = node.FirstChild.InnerText;
Console.WriteLine(author); //输出 张三 //XmlElement出场
XmlElement element = doc.DocumentElement; //根元素节点
Console.WriteLine(element.Name); //XmlAttribute出场
XmlAttribute attribute = element.FirstChild.Attributes[0]; //输出30
Console.WriteLine(attribute.Value); //XmlComment出场
XmlComment comment = doc.CreateComment("这是字数!");
element.PrependChild(comment); doc.Save(@"D:\123123.xml"); Console.ReadKey();
}

一、XmlReader的使用
XmlReader类专门用于读取Xml文件,最大的特点在于支持Settings。
| 属性 | 说明 |
| AttributeCount | 当在派生类中被重写时,获取当前节点上的属性数 |
| BaseURI | 当在派生类中被重写时,获取当前节点的基 URI |
| CanReadBinaryContent | 获取一个值,该值指示 XmlReader 是否实现二进制内容读取方法 |
| Depth | 获取 XML 文档中当前节点的深度 |
| EOF | 获取一个值,该值指示此读取器是否定位在流的结尾 |
| HasAttributes | 获取一个值,该值指示当前节点是否有任何属性 |
| HasValue | 获取一个值,该值指示当前节点是否可以具有 Value |
| IsDefault | 获取一个值,该值指示当前节点是否是从 DTD 或架构中定义的默认值生成的特性 |
| IsEmptyElement | 获取一个值,该值指示当前节点是否为空元素(例如 <MyElement/>) |
| Item | 获取具有指定索引的属性的值,支持整形,字符串,LocalName 和 NamespaceURI作为参数 |
| LocalName | 获取当前节点的本地名称 |
| Name | 获取当前节点的限定名 |
| NamespaceURI | 获取读取器定位在其上的节点的命名空间 URI |
| NameTable | 获取与该实现关联的 XmlNameTable |
| NodeType | 获取当前节点的类型 |
| Prefix | 获取与当前节点关联的命名空间前缀 |
| QuoteChar | 获取用于括住特性节点值的引号字符 |
| ReadState | 获取读取器的状态 |
| SchemaInfo | 获取作为架构验证结果分配给当前节点的架构信息 |
| Settings | 获取用于创建此 XmlReader 实例的 XmlReaderSettings 对象 |
| Value | 获取当前节点的文本值 |
| ValueType | 获取当前节点的公共语言运行时 (CLR) 类型 |
| XmlLang | 获取当前的 xml:lang 范围 |
| XmlSpace | 获取当前的 xml:space 范围 |
常用方法:
| 方法 | 说明 |
| Close | 将 ReadState 更改为 Closed |
| Create | 使用指定的参数类型创建一个新的 XmlReader 实例 |
| Dispose | 释放由 XmlReader 类的当前实例占用的所有资源 |
| GetAttribute | 当在派生类中被重写时,获取具有指定索引的属性的值 |
| GetValueAsync | 异步获取当前节点的值 |
| IsName | 返回一个值,该值指示字符串参数是否是有效的 XML 名称 |
| IsNameToken | 返回一个值,该值指示该字符串参数是否是有效的 XML 名称标记 |
| IsStartElement | 调用 MoveToContent 并测试当前内容节点是否是开始标记或空元素标记 |
| LookupNamespace | 在当前元素的范围内解析命名空间前缀 |
| MoveToAttribute | 移动到具有指定索引的属性 |
| MoveToContent |
如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。 |
| MoveToElement | 移动到包含当前属性节点的元素 |
| MoveToFirstAttribute | 移动到第一个属性 |
| MoveToNextAttribute | 移动到下一个属性 |
| Read | 从流中读取下一个节点 |
| ReadAttributeValue | 将属性值解析为一个或多个 Text、EntityReference 或 EndEntity 节点 |
| ReadContentAs | 将内容作为指定类型的对象读取 |
| ReadStartElement | 检查当前节点是否为元素并将读取器推进到下一个节点 |
| ReadElementContentAs | 将元素内容作为请求类型读取 |
| ReadElementString | 读取纯文本元素 |
| ReadEndElement | 检查当前内容节点是否为结束标记并将读取器推进到下一个节点 |
| ReadInnerXml | 将所有内容(包括标记)当做字符串读取 |
| ReadOuterXml | 读取表示该节点和所有它的子级的内容(包括标记) |
| ReadString | 将元素或文本节点的内容当做字符串读取 |
| ReadSubtree | 此实例可用于读取当前节点及其所有子节点 |
| ReadToDescendant | 让 XmlReader 前进到下一个具有指定限定名的子代元素 |
| ReadToFollowing | 一直读取,直到找到具有指定限定名的元素 |
| ReadToNextSibling | 让 XmlReader 前进到下一个具有指定限定名的同级元素 |
| ReadValueChunk | 读取嵌入在 XML 文档中的大量文本流 |
| ResolveEntity | 解析 EntityReference 节点的实体引用 |
| Skip | 跳过当前节点的子级 |
示例:

class Program
{
static void Main(string[] args)
{
//<?xml version="1.0" encoding="utf-8"?>
//<Persons>
// <Person>
// <Name>刘备</Name>
// <Age>28</Age>
// </Person>
//</Persons> XmlReader reader = XmlReader.Create(@"D:\123.xml");
reader.ReadString();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "Name")
{
Console.WriteLine(reader.ReadElementString()); //刘备
Console.WriteLine(reader.HasAttributes); //false
}
}
} Console.ReadKey();
}
}

大多数方法和属性的使用方法都和上面的例子相似,不在啰嗦。下面来说说,XmlReader的特色功能,自定义格式,其中最主要用到的是属性Settings。
示例2:

static void Main(string[] args)
{
//<?xml version="1.0" encoding="utf-8"?>
//<Persons>
// <Person>
// <!-- 这是一个牛人 -->
// <Name>刘备</Name>
// <Age>28</Age>
// </Person>
//</Persons> XmlReaderSettings RSetting = new XmlReaderSettings();
RSetting.IgnoreComments = false; //如果设置为true则忽略所有注释 XmlReader reader = XmlReader.Create(@"D:\123.xml", RSetting);
reader.ReadString();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Comment)
{
Console.WriteLine(reader.Value); //这是一个牛人
}
} Console.ReadKey();
}
}

二、XmlWriter的使用
常用属性:
| 属性 | 说明 |
| Settings | 获取用于创建此 XmlWriter 实例的 XmlWriterSettings 对象 |
| WriteState | 当在派生类中被重写时,获取编写器的状态 |
| XmlLang | 当在派生类中被重写时,获取当前的 xml:lang 范围 |
| XmlSpace | 当在派生类中被重写时,获取表示当前 xml:space 范围的 XmlSpace |
常用方法:
| 方法 | 说明 |
| Close | 当在派生类中被重写时,关闭此流和基础流 |
| Create | 使用指定的流创建一个新的 XmlWriter 实例 |
| Dispose | 释放由 XmlWriter 类的当前实例占用的所有资源 |
| Flush | 将缓冲区中的所有内容刷新到基础流,并同时刷新基础流 |
| LookupPrefix | 返回在当前命名空间范围中为该命名空间 URI 定义的最近的前缀 |
| WriteAttributes | 写出在 XmlReader 中当前位置找到的所有属性 |
| WriteAttributeString | 写出具有指定的本地名称和值的属性 |
| WriteBase64 | 将指定的二进制字节编码为 Base64 并写出结果文本 |
| WriteBinHex | 将指定的二进制字节编码为 BinHex 并写出结果文本 |
| WriteCData | 写出包含指定文本的 <![CDATA[...]]> 块 |
| WriteCharEntity | 为指定的 Unicode 字符值强制生成字符实体 |
| WriteChars | 以每次一个缓冲区的方式写入文本 |
| WriteComment | 写出包含指定文本的注释 <!--...--> |
| WriteDocType | 写出具有指定名称和可选属性的 DOCTYPE 声明 |
| WriteElementString | 编写具有指定的本地名称和值的元素 |
| WriteEndAttribute | 关闭上一个 WriteStartAttribute 调用 |
| WriteStartDocument | 编写版本为"1.0"的 XML 声明 |
| WriteEndDocument | 关闭任何打开的元素或属性并将编写器重新设置为 Start 状态 |
| WriteStartElemen | 写入指定的开始标记并将其与给定的命名空间和前缀关联起来 |
| WriteEndElement | 关闭一个元素并弹出相应的命名空间范围 |
| WriteEntityRef | 按 &name; 写出实体引用 |
| WriteFullEndElement | 关闭一个元素并弹出相应的命名空间范围 |
| WriteName | 写出指定的名称,确保它是符合 W3C XML 1.0 建议 |
| WriteNmToken | 写出指定的名称,确保它是符合 W3C XML 1.0 建议 |
| WriteNode | 将所有内容从读取器复制到编写器并将读取器移动到下一个同级的 |
| WriteProcessingInstruction | 写出在名称和文本之间带有空格的处理指令 |
| WriteQualifiedName | 写出命名空间限定的名称。 此方法查找位于给定命名空间范围内的前缀 |
| WriteRaw | 从字符串手动编写原始标记 |
| WriteStartAttribute | 用指定的本地名称编写属性的起点 |
| WriteString | 编写给定的文本内容 |
| WriteSurrogateCharEntity | 为代理项字符对生成并编写代理项字符实体 |
| WriteValue | 编写一个参数中指定的类型的值 |
| WriteWhitespace | 写出给定的空白 |
示例:

static void Main(string[] args)
{
//<?xml version="1.0" encoding="utf-8" standalone="yes"?><Persons><Person><Name>刘备</Name><Age>28</Age></Person></Persons> using (FileStream fs = new FileStream(@"D:\123.xml",FileMode.Create,FileAccess.Write))
{
using (XmlWriter xw = XmlWriter.Create(fs))
{
//XML声明
xw.WriteStartDocument(true);
xw.WriteStartElement("Persons");
xw.WriteStartElement("Person");
xw.WriteStartElement("Name");
xw.WriteString("刘备");
xw.WriteEndElement();
xw.WriteStartElement("Age");
xw.WriteValue(28);
xw.WriteEndElement();
xw.WriteEndElement();
xw.WriteEndElement();
xw.WriteEndDocument();
}
}
Console.ReadKey();
}

上面的注释就是代码所生成的文档。
上面生成的XML有些问题,没换行,没法看。而且,如果我想去掉XML声明又怎么搞?
示例2:

static void Main(string[] args)
{
//<Persons>
// <Person>
// <Name>刘备</Name>
// <Age>28</Age>
// </Person>
//</Persons> XmlWriterSettings WSetting = new XmlWriterSettings();
//去掉XML声明
WSetting.OmitXmlDeclaration = true;
WSetting.Indent = true; using (FileStream fs = new FileStream(@"D:\123.xml",FileMode.Create,FileAccess.Write))
{
using (XmlWriter xw = XmlWriter.Create(fs, WSetting))
{
//XML声明
xw.WriteStartElement("Persons");
xw.WriteStartElement("Person");
xw.WriteStartElement("Name");
xw.WriteString("刘备");
xw.WriteEndElement();
xw.WriteStartElement("Age");
xw.WriteValue(28);
xw.WriteEndElement();
xw.WriteEndElement();
xw.WriteEndElement();
}
}
Console.ReadKey();
}

这样生成的XML就又缩进又去掉命名空间了,更多的设置在XmlWriterSettings类的实例中设置。
.net学习笔记---xml操作及读写的更多相关文章
- html学习笔记-XML
html学习笔记-XML Table of Contents 1. XML简介 2. XML用途 3. XML树结构 4. XML语法 5. XML元素 6. XML属性 7. XML验证 8. XM ...
- Javascript学习笔记二——操作DOM
Javascript学习笔记 DOM操作: 一.GetElementById() ID在HTML是唯一的,getElementById()可以定位唯一的一个DOM节点 二.querySelector( ...
- MongoDB学习笔记:Python 操作MongoDB
MongoDB学习笔记:Python 操作MongoDB Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...
- .net学习笔记---xml基础知识
一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...
- Javascript学习笔记三——操作DOM(二)
Javascript学习笔记 在我的上一个博客讲了对于DOM的基本操作内容,这篇继续巩固一下对于DOM的更新,插入和删除的操作. 对于HTML解析的DOM树来说,我们肯定会时不时对其进行一些更改,在原 ...
- C#学习笔记-XML的读写(一)
需要解析的配置XML <?xml version="1.0" encoding="utf-8" ?> <configurations> ...
- python学习笔记:文件操作和集合(转)
转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...
- PHP学习笔记--文件目录操作(文件上传实例)
文件操作是每个语言必须有的,不仅仅局限于PHP,这里我们就仅用PHP进行讲解 php的文件高级操作和文件上传实例我放在文章的最后部分.--以后我还会给大家写一个PHP类似于网盘操作的例子 注意:阅读此 ...
- 学习笔记—XML
XML XML简介 XML指可扩展标记语言(EXtensible Markup Language),是一种标记语言. XML是一种灵活的语言,标签没有被预定义,需要自行定义标签. 通常,XML被用于信 ...
随机推荐
- lintcode 75 Find Peak Element
Hi 大家,这道题是lintcode上的find peak element的题,不是leecode的那道, 这两道题是有区别的,这道题的题目中说明了:只有左右两侧的数都小于某个元素,这种才是峰值, 而 ...
- word20161201
http://baike.baidu.com/link?url=ZTTkA-suMlJNGb2AeNBE2E6MZQZwjkvWXKgmUpeLBIrCfC-k32cGJOJLrtDlLXjsTfkD ...
- PHP中interface与 implements 关键字
类中接口的应用 1.关键字:interface 2.关键字:implements 1.接口的介绍与创建 接口:一种成员属性全部为抽象或常量的特殊抽象类. 规则: 1.类中全部为抽象方法. 2.抽象方法 ...
- (原创)Activity启动模式之singleTask
android中activity有四种启动模式 standard(默认):在同一个任务栈中可以有重复的activity,基本没什么限制 singleTop:只有当此activity在栈顶时,去创建它, ...
- php preg_库正则匹配
<?php //preg_库提供的正则 preg_match();//进行正则表达式匹配 /* preg_match (pattern , subject, matches) 参数 描述 pat ...
- 2.AngularJS MVC
AngularJs的MVC全部借助于$scope(作用域)实现 1.ng指令 <!doctype html> <html ng-app> <head> <me ...
- COGS 902 乐曲主题 题解 & hash入门贺
[题意] 给定一个长为n的序列,元素都是不超过88的正整数,求序列中主题的最大长度. 所谓主题是指在序列中出现了至少两次并且不相交的子串.特别的,主题可以变调,也就是说如果一个子串全部加上或减去一个数 ...
- github 多个项目共用同一个key的方法
后面的项目不用添加ssh keys, 直接在项目下设置合作者(Collaborators), 搜索出去加进去即可免密码传代码.
- js本地解析xls文件
有个插件在这:oss.sheetjs.com 将demo拷贝整理(注意js的齐全)即可. 这里下载:http://download.csdn.net/detail/lion_awake/9326139
- ndk学习13: proc
一.进程相关信息 /proc目录中包含许多以数字命名的子目录,这些数字表示系统当前正在运行进程的进程号,里面包含对应进程相关的多个信息文件 结构如下: 进程相关的信息如下: 部分信息如下 cmdlin ...