当前位置:首页 > Windows程序 > 正文

C# 操作XML文档 使用XmlDocument类方法

2021-03-21 Windows程序

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 city="Beijing" country="China"> 
<Contact gender="female" title="Support">Li Li</Contact> 
</Customer> 
<Customer city="Amsterdam" country="The Netherlands"> 
<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 city="Amsterdam" country="The Netherlands"> 
<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 city="Beijing" country="China"> 
<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文档为例: 

复制代码代码如下:

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/64888.html