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


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

  • 相关阅读:
    Visifire正式版(v1.1)发布
    [转]PSP机能强大!已能模拟运行WINDOWS系统?
    在Silverlight+WCF中应用以角色为基础的安全模式(一)基础篇之角色为基础的安全模式简介 Virus
    C#的加密解密算法,包括Silverlight的MD5算法 Virus
    MMORPG programming in Silverlight Tutorial (10)Implement the sprite’s 2D animation (Part IV)
    Game Script: Rescue Bill Gates
    MMORPG programming in Silverlight Tutorial (9)KeyFrame Animation
    MMORPG programming in Silverlight Tutorial (5)Implement the sprite’s 2D animation (Part II)
    MMORPG programming in Silverlight Tutorial (7)Perfect animation
    MMORPG programming in Silverlight Tutorial (3)Animate the object (Part III)
  • 原文地址:https://www.cnblogs.com/neights/p/5387984.html
Copyright © 2020-2023  润新知