XML: 使用XmlDocument 与 XmlReader 类

XML: 使用XmlDocument 与 XmlReader 类一.XmlDocument类:XmlDocument与XmlReader类从.NET1.0就已经存在了。W3C定义了一个叫做文件对象模型(DOM:DocumentObjectModel)的标准来处理XML文档。支持DOM的类可以自由地定位并修改XML文档。要想使用XmlDocument类,需要添加System.Xml.dll的引用,并且引入System.Xml命名空间。XmlDocu

大家好,又见面了,我是你们的朋友全栈君。

一. XmlDocument类:
XmlDocument与XmlReader类从.NET 1.0就已经存在了。W3C定义了一个叫做文件对象模型(DOM: Document Object Model)的标准来处理XML文档。支持DOM的类可以自由地定位并修改XML文档。要想使用XmlDocument类,需要添加System.Xml.dll的引用,并且引入System.Xml命名空间。XmlDocument类使用DOM级别1与级别2,在内存中对XML进行表示。这个类可以定位寻找或者修改XML结点。

1.创建XmlDocument对象:
下面这个例子演示了如何使用XmlDocument类。

      private void createAndSaveXmlDocumentToolStripMenuItem_Click(
         object sender, EventArgs e)
      {
         //Declare and create new XmlDocument
         var xmlDoc = new XmlDocument();

         XmlElement el;
         int childCounter;
         int grandChildCounter;

         //Create the xml declaration first
         xmlDoc.AppendChild(
            xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null));

         //Create the root node and append into doc
         el = xmlDoc.CreateElement("MyRoot");
         xmlDoc.AppendChild(el);

         //Child Loop
         for (childCounter = 1; childCounter <= 4; childCounter++)
         {
            XmlElement childelmt;
            XmlAttribute childattr;

            //Create child with ID attribute
            childelmt = xmlDoc.CreateElement("MyChild");
            childattr = xmlDoc.CreateAttribute("ID");
            childattr.Value = childCounter.ToString();
            childelmt.Attributes.Append(childattr);

            //Append element into the root element
            el.AppendChild(childelmt);
            for (grandChildCounter = 1; grandChildCounter <= 3;
               grandChildCounter++)
            {
               //Create grandchildren 
               childelmt.AppendChild(xmlDoc.CreateElement("MyGrandChild"));
            }
         }

         //Save to file
         xmlDoc.Save(getFilePath("XmlDocumentTest.xml"));
         txtLog.AppendText("XmlDocumentTest.xml Created\r\n");

      }

      private string getFilePath(string fileName)
      {
         return Path.Combine(Environment.GetFolderPath(
            Environment.SpecialFolder.Desktop), fileName);
      }

最后生成的XML文档如下:

<?xml version="1.0" encoding="utf-8"?>
<MyRoot>
  <MyChild ID="1">
    <MyGrandChild />
    <MyGrandChild />
    <MyGrandChild />
  </MyChild>
  <MyChild ID="2">
    <MyGrandChild />
    <MyGrandChild />
    <MyGrandChild />
  </MyChild>
  <MyChild ID="3">
    <MyGrandChild />
    <MyGrandChild />
    <MyGrandChild />
  </MyChild>
  <MyChild ID="4">
    <MyGrandChild />
    <MyGrandChild />
    <MyGrandChild />
  </MyChild>
</MyRoot>

2.使用DOM来解析XmlDocument对象:
XmlDocument对象可以使用递归的方法来遍历所有元素。请看下面的例子:

      private void parsingAndXmlDocumentToolStripMenuItem_Click(object sender, EventArgs e)
      {
         XmlDocument xmlDoc = new XmlDocument();
         xmlDoc.Load(getFilePath("XmlDocumentTest.xml"));
         RecurseNodes(xmlDoc.DocumentElement);
      }

      public void RecurseNodes(XmlNode node)
      {
         var sb = new StringBuilder();
         //start recursive loop with level 0
         RecurseNodes(node, 0, sb);
         txtLog.Text = sb.ToString();
      }

      public void RecurseNodes(XmlNode node, int level, StringBuilder sb)
      {
         sb.AppendFormat("{0,2} Type:{1,-9} Name:{2,-13} Attr:",
            level, node.NodeType, node.Name);

         foreach (XmlAttribute attr in node.Attributes)
         {
            sb.AppendFormat("{0}={1} ", attr.Name, attr.Value);
         }
         sb.AppendLine();

         foreach (XmlNode n in node.ChildNodes)
         {
            RecurseNodes(n, level + 1, sb);
         }
      }

输出的结果如下:

 0 Type:Element   Name:MyRoot        Attr
 1 Type:Element   Name:MyChild       AttrID=1
 2 Type:Element   Name:MyGrandChild  Attr
 2 Type:Element   Name:MyGrandChild  Attr
 2 Type:Element   Name:MyGrandChild  Attr
 1 Type:Element   Name:MyChild       AttrID=2
 2 Type:Element   Name:MyGrandChild  Attr
 2 Type:Element   Name:MyGrandChild  Attr
 2 Type:Element   Name:MyGrandChild  Attr
 1 Type:Element   Name:MyChild       AttrID=3
 2 Type:Element   Name:MyGrandChild  Attr
 2 Type:Element   Name:MyGrandChild  Attr
 2 Type:Element   Name:MyGrandChild  Attr
 1 Type:Element   Name:MyChild       AttrID=4
 2 Type:Element   Name:MyGrandChild  Attr
 2 Type:Element   Name:MyGrandChild  Attr
 2 Type:Element   Name:MyGrandChild  Attr

3.搜索XmlDocument对象:
SelectSingleNode方法可以用来定位XML元素;它需要将XPath查询传递给该方法。下面的代码演示了如何通过使用XPath查询来调用SelectSingleNode方法查询到ID为3的MyChild元素。

      private void searchingAnXmlDocumentToolStripMenuItem_Click(
         object sender, EventArgs e)
      {
         var xmlDoc = new XmlDocument();
         xmlDoc.Load(getFilePath("XmlDocumentTest.xml"));

         var node = xmlDoc.SelectSingleNode("//MyChild[@ID='3']");
         RecurseNodes(node);
      }

GetElementsByTagName方法返回一个包含所有符合条件的XmlNode列表。

      private void getElementsByTagNameToolStripMenuItem_Click(
         object sender, EventArgs e)
      {
         var xmlDoc = new XmlDocument();
         xmlDoc.Load(getFilePath("XmlDocumentTest.xml"));

         var elmts = xmlDoc.GetElementsByTagName("MyGrandChild");

         var sb = new StringBuilder();
         foreach (XmlNode node in elmts)
         {
            RecurseNodes(node, 0, sb);
         }
         txtLog.Text = sb.ToString();
      }

SelectNodes方法也需要使用XPath查询来返回一个XmlNode 列表。这个方法要比GetElementsByTagName更灵活,因为GetElementsByTagName局限于标签名(tag name)。

      private void selectNodesToolStripMenuItem_Click(
         object sender, EventArgs e)
      {
         var xmlDoc = new XmlDocument();
         xmlDoc.Load(getFilePath("XmlDocumentTest.xml"));

         var elmts = xmlDoc.SelectNodes("//MyGrandChild");

         var sb = new StringBuilder();
         foreach (XmlNode node in elmts)
         {
            RecurseNodes(node, 0, sb);
         }
         txtLog.Text = sb.ToString();
      }

 

二. XmlReader类:
XmlReader是一个抽象类,用来读取和解析XML。一个更常用的子类是XmlTextReader,它可以一个结点一个结点的读取XML。XmlReader类提供最快并且占用内存最少的方法来读取和解析XML数据流,该读取只能向前,并且没有缓存。这个类适用于读取很大的XML文件,并且需要的数据在文件里靠前的位置。下面是一个使用XmlReader的例子:

      private void parsingWithXmlReaderToolStripMenuItem_Click(object sender, EventArgs e)
      {
         var sb = new StringBuilder();
         var xmlReader = new XmlTextReader(getFilePath("XmlDocumentTest.xml"));

         while (xmlReader.Read())
         {
            switch (xmlReader.NodeType)
            {
               case XmlNodeType.XmlDeclaration:
               case XmlNodeType.Element:
               case XmlNodeType.Comment:
                  sb.AppendFormat("{0}: {1} = {2}",
                                    xmlReader.NodeType,
                                    xmlReader.Name,
                                    xmlReader.Value);
                  sb.AppendLine();
                  break;
               case XmlNodeType.Text:
                  sb.AppendFormat(" - Value: {0}", xmlReader.Value);
                  sb.AppendLine();
                  break;
            }

            if (xmlReader.HasAttributes)
            {
               while (xmlReader.MoveToNextAttribute())
               {
                  sb.AppendFormat(" - Attribute: {0} = {1}",
                                    xmlReader.Name,
                                    xmlReader.Value);
                  sb.AppendLine();
               }
            }
         }
         xmlReader.Close();
         txtLog.Text = sb.ToString();
      }

输出结果如下:

XmlDeclaration: xml=version="1.0" encoding="utf-8"
  Attribute: version=1.0
  Attribute: encoding=utf-8
Element: MyRoot=
Element: MyChild=
  Attribute: ID=1
Element: MyGrandChild=
Element: MyGrandChild=
Element: MyGrandChild=
Element: MyChild=
  Attribute: ID=2
Element: MyGrandChild=
Element: MyGrandChild=
Element: MyGrandChild=
Element: MyChild=
  Attribute: ID=3
Element: MyGrandChild=
Element: MyGrandChild=
Element: MyGrandChild=
Element: MyChild=
  Attribute: ID=4
Element: MyGrandChild=
Element: MyGrandChild=
Element: MyGrandChild=

 

三. 小节:
• XmlDocument类读取XML结点是全部存在内存中,任意定位,并且可读也可写的。
• XmlReader类读取XML结点使用的是快速数据流(不是一次读取完将数据全部存在内存中),只能向前,只读的。
• XmlDocument类易于使用,而XmlReader类读取效率很高。
• XmlDocument类可以使用元素名来读取XML结点。
• XmlDocument类可以使用XPath来读取结点。

 

原文出自《Access Data with Microsoft .NET Framework 4》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150751.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月19日 下午9:00
下一篇 2022年6月19日 下午9:00


相关推荐

  • python敏感词过滤代码简单_python 实现敏感词过滤的方法

    python敏感词过滤代码简单_python 实现敏感词过滤的方法如下所示 usr bin python2 6 coding utf 8 importtimecl object def init self self children None Theencodeofw 8defadd word root word node rootforiinra len

    2026年3月16日
    3
  • linux 安装Jenkins和配置

    linux 安装Jenkins和配置简要介绍Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。语言:Java一句话描述:持续集成工具建议的版本建议使用版本为“jenkins-2.164.x”。环境清单:CentOS7.6配置安装环境安装OpenJDK。 要求Java的OpenJDK为“1.8.0”以上,可以通过以下命令安装…

    2025年7月7日
    7
  • java松耦合_java中关于高聚合与松耦合

    java松耦合_java中关于高聚合与松耦合把系统分为各个功能不同的板块 以电脑主机为例 高聚合就是指主板 cup 等内的各种零件之间的紧密联系 松耦合就是指主板与 cpu 的连接 主板与显卡的连接 主板与电源的连接 把显卡 主板内的零件看作小号零件 这些小号零件组成了大号零件 显卡 和 主板 小号零件之间的连接相比大号零件之间的连接更紧密 紧密的联系可以发挥出更高的性能 高聚合 高 性能高 聚合 联系紧密 不那么紧密的联系便于灵活使用

    2026年2月25日
    2
  • wrk压力测试使用心得(详细)

    wrk压力测试使用心得(详细)wrk 是一种现代 HTTP 基准测试工具 能够在单个多核 CPU 上运行时产生大量负载 它结合了多线程设计和可扩展的事件通知系统 如 epoll 和 kqueue 以及使用了 redis 的 ae 事件循环 可以用很少的线程压出很大的并发量 一 wrk 下载和安装可以从 github 上下载 wrk 源码 如果没有 git 可以百度安装一下 1 window 系统打开 git 窗口 在目录中使用此命令下载 wrk 如果服务器

    2026年3月26日
    2
  • nc报销系统用的什么java_财务NC系统是什么?

    nc报销系统用的什么java_财务NC系统是什么?展开全部 1 NC 系统是一个全面的预算管理平台 支持企业从销售计划 生产 e4b893e5b19e 计划 采购计划 费用计划 投资计划 资金计划 损益计划 资产负债计划的全面预算控制 实现了对经营行为的事前编制 事中控制和事后分析 2 NC 财务系统也叫 NC 系统 充分考虑了用户的个性化需求 提供了多种自我配置和客户

    2026年3月18日
    2
  • PHOTOSHOP MAC快捷键

    PHOTOSHOP MAC快捷键工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)矩形、椭圆选框工具【M】裁剪工具【C】移动工具【V】套索、多边形套索、磁性套索【L】魔棒工具【W】喷枪工具【J】画笔工具【B】像皮图章、图案图章【S】历史记录画笔工具【Y】像皮擦工具【E】铅笔、直线工具【N】模糊、锐化、涂抹工具【R】减淡、加深、海棉工

    2022年6月24日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号