time 
设为首页】【收藏本站
当前位置: 主页 > 程序设计 > .net > C# > C#加载和查询XML的XmlDocument类使用实例

C#加载和查询XML的XmlDocument类使用实例

时间:2012-11-19 23:10 点击:3645次 字体:[ ]




 W3C制定了XML DOM标准。很多编程语言中多提供了支持W3C XML DOM标准的API。我在之前的文章中介绍过Javascript加载和查询XML实例。在本文中,我来介绍一下.Net中的XmlDocument类。它支持并扩展了W3C XML DOM标准。它将整个XML文档都先装载进内存中,然后再对XML文档进行操作,所以如果XML文档内容过大,不建议使用XmlDocument类,因为会消耗过多内存。对于很大的XML文档,可以使用XmlReader类来读取。因为XmlReader使用Steam(流)来读取文件,所以不会对内存造成太大的消耗。下面就来看一下如何使用XmlDocument类。

 

(一) 加载

加载XML比较常用的有三种方法:

 

  1. public virtual void Load(string filename); 
  2.  
  3. public virtual void Load(Stream inStream); 
  4.  
  5. public virtual void LoadXml(string xml); 

下面代码演示如何使用它们:

  1. XmlDocument xmlDoc = new XmlDocument();  
  2. xmlDoc.Load("XMLFile1.xml");  
  3.  
  4. Entity retrievedAnnotation = _orgService.Retrieve("annotation"  
  5.     , new Guid("C1B13C7F-F430-E211-8FA1-984BE1731399"), new ColumnSet(true));                 
  6. byte[] fileContent = Convert.FromBase64String(retrievedAnnotation["documentbody"].ToString());  
  7. MemoryStream ms = new MemoryStream(fileContent);  
  8. XmlDocument xmlDoc2 = new XmlDocument();  
  9. xmlDoc2.Load(ms); 
  10.  
  11. string str = @"<Customers><Customer id='01' city='Beijing' country='China' name='Lenovo'/></Customers>";  
  12. XmlDocument xmlDoc3 = new XmlDocument();  
  13. xmlDoc3.LoadXml(str); 

 

(二) 查询

对XML的元素、属性、文本的查询可以使用XPath。具体的定义可以参看w3school。

首先应该了解一下XPath表达式:

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

 

 

 

 

 

 

 

我们主要使用两个方法来查询XML文档,SelectNodes(xpath expression)和SelectSingleNode(xpath expression)。

SelectNodes返回一个XmlNodeList对象,也就是所有符合xpath表达式的xml节点都将会被返回,你需要对返回的结果进行遍历。

SelectSingleNode只返回第一个符合xpath表达式的节点,或者返回null。

以下面的XML文件为例,我们进行一些演示:

 

  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <Customers>  
  3.   <Customer id="01" city="Beijing" country="China" name="Lenovo">  
  4.     <Contact gender="female" title="Support">Li Li</Contact>  
  5.   </Customer>  
  6.   <Customer id="02" city="Amsterdam" country="The Netherlands" name="Shell">  
  7.     <Contact gender="male" title="Sales Person">Aaron Babbitt</Contact>  
  8.     <Contact gender="female" title="Sales Manager">Daisy Cabell</Contact>  
  9.     <Contact gender="male" title="Sales Person">Gabriel Eads</Contact>  
  10.   </Customer>  
  11. </Customers> 

 

1. 返回所有Contact节点:  

 

  1. XmlNodeList nodelist = xmlDoc.SelectNodes("/Customers/Customer/Contact");  
  2. foreach (XmlNode node in nodelist)  
  3. {  
  4.     Console.WriteLine(node.OuterXml);  
  5. }  

 

输出结果为:

<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文档为例:

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <Customers>  
  3.   <Customer id="01" name="Lenovo" country="China" city="Beijing">  
  4.     <Contact title="Support" gender="female">Li Li</Contact>  
  5.   </Customer>  
  6. </Customers> 

 

 

  1. var xmlDoc = new XmlDocument();  
  2. //Create the xml declaration first  
  3. xmlDoc.AppendChild(xmlDoc.CreateXmlDeclaration("1.0""utf-8"null)); 
  4.  
  5. //Create the root node and append into doc  
  6. var el = xmlDoc.CreateElement("Customers");  
  7. xmlDoc.AppendChild(el); 
  8.  
  9. // Customer Lenovo  
  10. XmlElement elementCustomer = xmlDoc.CreateElement("Customer"); 
  11.  
  12. XmlAttribute attrID = xmlDoc.CreateAttribute("id");  
  13. attrID.Value = "01";  
  14. elementCustomer.Attributes.Append(attrID); 
  15.  
  16. XmlAttribute cityID = xmlDoc.CreateAttribute("city");  
  17. cityID.Value = "Beijing";  
  18. elementCustomer.Attributes.Append(cityID); 
  19.  
  20. XmlAttribute attrCountry = xmlDoc.CreateAttribute("country");  
  21. attrCountry.Value = "China";  
  22. elementCustomer.Attributes.Append(attrCountry); 
  23.  
  24. XmlAttribute nameCountry = xmlDoc.CreateAttribute("name");  
  25. nameCountry.Value = "Lenovo";  
  26. elementCustomer.Attributes.Append(nameCountry); 
  27.  
  28. el.AppendChild(elementCustomer); 
  29.  
  30. // Contact Li Li  
  31. XmlElement elementContact = xmlDoc.CreateElement("Contact");  
  32. elementContact.InnerText = "Li Li"
  33.  
  34. XmlAttribute attrGender = xmlDoc.CreateAttribute("gender");  
  35. attrGender.Value = "female";  
  36. elementContact.Attributes.Append(attrGender); 
  37.  
  38. XmlAttribute titleGender = xmlDoc.CreateAttribute("title");  
  39. titleGender.Value = "Support";  
  40. elementContact.Attributes.Append(titleGender); 
  41.  
  42. elementCustomer.AppendChild(elementContact); 
  43.  
  44. xmlDoc.Save("test.xml"); 

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



本文地址 : http://www.fengfly.com/plus/view-210328-1.html
标签: 查询 XML 加载 C# 使用实例 XmlDocument
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: