W3C制定了XML DOM标准。很多编程语言中多提供了支持W3C XML DOM标准的API。我在之前的文章中介绍过如何使用Javascript对XML文档进行加载与查询。在本文中,我来介绍一下.Net中的XmlDocument类。它支持并扩展了W3C XML DOM标准。它将整个XML文档都先装载进内存中,然后再对XML文档进行操作,所以如果XML文档内容过大,不建议使用XmlDocument类,因为会消耗过多内存。对于很大的XML文档,可以使用XmlReader类来读取。因为XmlReader使用Steam(流)来读取文件,所以不会对内存造成太大的消耗。下面就来看一下如何使用XmlDocument类。 
(一) 加载 
加载XML比较常用的有三种方法: 
public virtual void Load(string filename); 
public virtual void Load(Stream inStream); 
public virtual void LoadXml(string xml); 
下面代码演示如何使用它们:

复制代码代码如下:
XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load("XMLFile1.xml"); 
Entity retrievedAnnotation = _orgService.Retrieve("annotation" 
, new Guid("C1B13C7F-F430-E211-8FA1-984BE1731399"), new ColumnSet(true)); 
byte[] fileContent = Convert.FromBase64String(retrievedAnnotation["documentbody"].ToString()); 
MemoryStream ms = new MemoryStream(fileContent); 
XmlDocument xmlDoc2 = new XmlDocument(); 
xmlDoc2.Load(ms); 
string str = @"<Customers><Customer id='01' city='Beijing' country='China' name='Lenovo'/></Customers>"; 
XmlDocument xmlDoc3 = new XmlDocument(); 
xmlDoc3.LoadXml(str); 

(二) 查询 
对XML的元素、属性、文本的查询可以使用XPath。具体的定义可以参看w3school。 
首先应该了解一下XPath表达式:

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

我们主要使用两个方法来查询XML文档,SelectNodes(xpath expression)和SelectSingleNode(xpath expression)。 
SelectNodes返回一个XmlNodeList对象,也就是所有符合xpath表达式的xml节点都将会被返回,你需要对返回的结果进行遍历。 
SelectSingleNode只返回第一个符合xpath表达式的节点,或者返回null。 
以下面的XML文件为例,我们进行一些演示:

复制代码代码如下:
<?xml version="1.0" encoding="utf-8" ?> 
<Customers> 
<Customer id="01" city="Beijing" country="China" name="Lenovo"> 
<Contact gender="female" title="Support">Li Li</Contact> 
</Customer> 
<Customer id="02" city="Amsterdam" country="The Netherlands" name="Shell"> 
<Contact gender="male" title="Sales Person">Aaron Babbitt</Contact> 
<Contact gender="female" title="Sales Manager">Daisy Cabell</Contact> 
<Contact gender="male" title="Sales Person">Gabriel Eads</Contact> 
</Customer> 
</Customers> 

1. 返回所有Contact节点: 
XmlNodeList nodelist = xmlDoc.SelectNodes("/Customers/Customer/Contact"); 
foreach (XmlNode node in nodelist) 

Console.WriteLine(node.OuterXml); 

输出结果为: 
<Contact gender="female" title="Support">Li Li</Contact> 
<Contact gender="male" title="Sales Person">Aaron Babbitt</Contact> 
<Contact gender="female" title="Sales Manager">Daisy Cabell</Contact> 
<Contact gender="male" title="Sales Person">Gabriel Eads</Contact> 
2. 返回id为02的customer: 
XmlNode node = xmlDoc.SelectSingleNode("/Customers/Customer[@id='02']"); 
Console.WriteLine(node.OuterXml); 
输出结果为: 
<Customer id="02" city="Amsterdam" country="The Netherlands" name="Shell"> 
<Contact gender="male" title="Sales Person">Aaron Babbitt</Contact> 
<Contact gender="female" title="Sales Manager">Daisy Cabell</Contact> 
<Contact gender="male" title="Sales Person">Gabriel Eads</Contact> 
</Customer> 
3. 返回含有contact名为Li Li的contact: 
XmlNode node = xmlDoc.SelectSingleNode("/Customers/Customer/Contact[text()='Li Li']"); 
Console.WriteLine(node.OuterXml); 
输出结果: 
<Contact gender="female" title="Support">Li Li</Contact> 
4. 返回含有contact名为 Li Li 的customer。注意和3的区别: 
XmlNode node = xmlDoc.SelectSingleNode("/Customers/Customer[Contact/text()='Li Li']"); 
Console.WriteLine(node.OuterXml); 
输出结果: 
<Customer id="01" city="Beijing" country="China" name="Lenovo"> 
<Contact gender="female" title="Support">Li Li</Contact> 
</Customer> 
5. (1) 获取outer xml: 
XmlNode node = xmlDoc.SelectSingleNode("/Customers/Customer[@id='02']"); 
Console.WriteLine(node.OuterXml); 
(2) 获取 inner xml: 
XmlNode node = xmlDoc.SelectSingleNode("/Customers/Customer[@id='02']"); 
Console.WriteLine(node.InnerXml); 
(3) 获取 text 
XmlNode node = xmlDoc.SelectSingleNode("/Customers/Customer/Contact[text()='Li Li']"); 
Console.WriteLine(node.InnerText); 
(4) 获取属性 
XmlNode node = xmlDoc.SelectSingleNode("/Customers/Customer/Contact[text()='Li Li']"); 
Console.WriteLine(node.Attributes["gender"].Value); 
(三) 创建 
以创建以下XML文档为例:

复制代码代码如下:
<?xml version="1.0" encoding="UTF-8"?> 
<Customers> 
<Customer id="01" name="Lenovo" country="China" city="Beijing"> 
<Contact title="Support" gender="female">Li Li</Contact> 
</Customer> 
</Customers> 
复制代码代码如下:
var xmlDoc = new XmlDocument(); 
//Create the xml declaration first 
xmlDoc.AppendChild(xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null)); 
//Create the root node and append into doc 
var el = xmlDoc.CreateElement("Customers"); 
xmlDoc.AppendChild(el); 
// Customer Lenovo 
XmlElement elementCustomer = xmlDoc.CreateElement("Customer"); 
XmlAttribute attrID = xmlDoc.CreateAttribute("id"); 
attrID.Value = "01"; 
elementCustomer.Attributes.Append(attrID); 
XmlAttribute cityID = xmlDoc.CreateAttribute("city"); 
cityID.Value = "Beijing"; 
elementCustomer.Attributes.Append(cityID); 
XmlAttribute attrCountry = xmlDoc.CreateAttribute("country"); 
attrCountry.Value = "China"; 
elementCustomer.Attributes.Append(attrCountry); 
XmlAttribute nameCountry = xmlDoc.CreateAttribute("name"); 
nameCountry.Value = "Lenovo"; 
elementCustomer.Attributes.Append(nameCountry); 
el.AppendChild(elementCustomer); 
// Contact Li Li 
XmlElement elementContact = xmlDoc.CreateElement("Contact"); 
elementContact.InnerText = "Li Li"; 
XmlAttribute attrGender = xmlDoc.CreateAttribute("gender"); 
attrGender.Value = "female"; 
elementContact.Attributes.Append(attrGender); 
XmlAttribute titleGender = xmlDoc.CreateAttribute("title"); 
titleGender.Value = "Support"; 
elementContact.Attributes.Append(titleGender); 
elementCustomer.AppendChild(elementContact); 
xmlDoc.Save("test.xml"); 

总结: XmlDocument类是.Net API中提供的支持W3C XML DOM标准的类。可以用它来创建和查询XML文档。由于XmlDocument要将XML文档的内容全部装载进内存中,所以对于读取内容过大的XML文档,不适合使用XmlDocument类,而可以使用XmlReader来完成读取。

C# 操作XML文档 使用XmlDocument类方法的更多相关文章

  1. 操作xml文档的常用方式

    1.操作XML文档的两种常用方式: 1)使用XmlReader类和XmlWriter类操作 XmlReader是基于数据流的,占用极少的内存,是只读方式的,所以速度极快.只能采用遍历的模式查找数据节点 ...

  2. 操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP)

    原文:操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP) 不管是用 PHP 还是 C#, 在操作 XML 的时候我们除了一个节点一个节点去取值之外, 还有一个非常方便的表达式, 就是 ...

  3. 用ORM的思想操作XML文档,一个对象就搞定不要太简单。滚蛋吧!XmlDocument、XmlNode、Xml***……

    大家有没有这样的感受,一涉及XML文档操作就得百度一遍.是不是非!常!烦!.各种类型,各种方法,更别提为了找到一个节点多费劲.本来想写个XML操作的工具方法,写了两行一想既然XML文档是有规律的,如果 ...

  4. C#操作XML文档(XmlDocument、XmlNode、XmlAttribute、SelectSingleNode、SelectNodes、XmlNodeList)

    XML文档是一种通用的文档,这种文档既可以用.config作为后缀也可以用.xml作为后缀.XML文档主要由元素节点和节点的属性共同构成的.它有且仅有一个根节点,其他的节点全部都是根节点的子节点或者子 ...

  5. C#操作XML文档---基础

    增查改删代码如下 public void CreateXML() { XmlDocument xml = new XmlDocument(); xml.AppendChild(xml.CreateXm ...

  6. C#XmlHelper操作Xml文档的帮助类

    using System.Xml; using System.Data; namespace DotNet.Utilities { /// <summary> /// Xml的操作公共类 ...

  7. [XML] C# XmlHelper操作Xml文档的帮助类 (转载)

    点击下载 XmlHelper.rar 主要功能如下所示 /// <summary> /// 类说明:XmlHelper /// 编 码 人:苏飞 /// 联系方式:361983679 // ...

  8. 文档对象模型操作xml文档

    简介 :文档对象模型(DOM)是一种用于处理xml文档的API函数集. 2.1文档对象模型概述 按照W3C的定义,DOM是“一种允许程序或脚本动态地访问更新文档内容,结构和样式的.独立于平台和语言的规 ...

  9. C#XmlHelper帮助类操作Xml文档的通用方法汇总

    前言 该篇文章主要总结的是自己平时工作中使用频率比较高的Xml文档操作的一些常用方法和收集网上写的比较好的一些通用Xml文档操作的方法(主要包括Xml序列化和反序列化,Xml文件读取,Xml文档节点内 ...

随机推荐

  1. sublim课程2 sublim编辑器的使用(敲代码的时候把这个放旁边用)

    sublim课程2   sublim编辑器的使用(敲代码的时候把这个放旁边用) 一.总结 一句话总结:不必一次记住所有,不可能也得不偿失,先记住常用,慢慢来.(敲代码的时候把这个放旁边用,一下子就熟了 ...

  2. winscp ppk无需密码登录(失败)

    http://blog.csdn.net/catoop/article/details/8284803 按上文将Linux下生成的密钥文件id_rsa通过puttygen生成对应的.ppk文件,用wi ...

  3. Cocos2d-x学习笔记(16)(常见22种特效)

    1.CCShaky3D::create(int range.bool shakeZ,const ccGridSize& gridSize,float duration)//创建一个3D晃动的特 ...

  4. php自带加密解密函数

    php自带加密解密函数 一.总结 一句话总结:可逆和不可逆函数. 二.php自带加密解密函数 1.不可逆的加密函数为:md5().crypt() md5() 用来计算 MD5 哈稀.语法为:strin ...

  5. 卷积神经网络Lenet-5实现

    卷积神经网络Lenet-5实现 原文地址:http://blog.csdn.net/hjimce/article/details/47323463 作者:hjimce 卷积神经网络算法是n年前就有的算 ...

  6. C#中的“静态”

    静态构造函数: C#的一个新特征是也能够给类编写无參数的静态构造函数. 编写静态构造函数的一个原因是,类有一些静态字段或属性,须要在第一次使用类之前.从外部源中初始化这些静态的字段和属性. .NET运 ...

  7. 小强的HTML5移动开发之路(34)——jQuery中的选择器

    一.jQuery是什么? jQuery是由美国人John Resig创建,至今吸引了来自世界各地的众多javascript高手加入其中. jQuery的创始人和技术领袖,目前在Mozilla担任Jav ...

  8. DYNAMIC CONTEXT SWITCHING BETWEEN ARCHITECTURALLY DISTINCT GRAPHICS PROCESSORS

    FIELD OF INVENTION This invention relates to computer graphics processing, and more specifically to ...

  9. Tomcat系列之服务器的安装与配置以及各组件详解

    Tomcat系列之服务器的安装与配置以及各组件详解 大纲 一.前言 二.安装与配置Tomcat 三.Tomcat 目录的结构 四.Tomcat 配置文件 注,本文的测试的操作系统为CentOS 6.4 ...

  10. python 爬取bilibili 视频弹幕

    # -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/09 下午 4:50 # 爬取弹幕 import requests import j ...