控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

C# 使用XmlDocument类对XML文档进行操作

作者:未知 出处:cnblog 2012年11月20日 阅读:

 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来完成读取。
 
 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统