`
isiqi
  • 浏览: 16033234 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

XML: 使用XmlDocument 与 XmlReader 类

 
阅读更多

一. 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》

分享到:
评论

相关推荐

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

    它将整个XML文档都先装载进内存中,然后再对XML文档进行操作,所以如果XML文档内容过大,不建议使用XmlDocument类,因为会消耗过多内存。对于很大的XML文档,可以使用XmlReader类来读取。因为XmlReader使用Steam(流...

    xml字符串转化Dataset

    DOM的类:XmlNode、Xmldocument和XmlElement等; Xpath的类:XmlNavigator;XSLT的类:XslTransform。 显示XML文件内容 用C#编程实现显示XML文件中信息的方法是使用.NET提供的标准类把XML文件内容读入一个...

    LINQ XML控制类

    using (XmlReader reader = new XmlNodeReader(this._xmlDocumentdoc.DocumentElement)) { dsxml = new DataSet(); dsxml.ReadXml(reader); reader.Close(); } if (dsxml != null) return dsxml.Tables[0];...

    xmlReader_解析xml文件

    NULL 博文链接:https://ladybird2010.iteye.com/blog/757745

    基于C#中XmlReader读取Xml的深入分析

    XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存,而在有些场景下我们必须考虑尽可能节省内存.这时候就该XmlReader和XmlWriter出场了。XmlReader读取Xml需要通过...

    用c#操作Xml

    里面有三个小例子:使用XmlReader读Xml;使用XmlWriter写Xml;通过XmlDocument读写Xml文档。

    Java读取XML文件自制工具类

    用WC3的DOM实现对XML文件的读取。 方法摘要: //通过文件路径及文件名读取xml public XMLReader(String path, String filename); //初始化读取包下的的XML文件 public XMLReader(Package package1, String fileName)...

    xml入门教程/xml入门教程

    XML文档与引用URI标识的名域相结合,来 限定其中的元素和属性名。 示例: &lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; &lt;name&gt;t1 &lt;sex&gt;man &lt;name&gt;s1&lt;/name&gt;&lt;!--这个name和teacher根元素...

    XML 高级编程,完整目录版,便于阅读

    第三章,XmlDocument 第四章,XPath 第五章,转换 第六章,ADO.NET 第七章,SQL Server 2000 和SqlXml 托管类 第八章,电子商务和XML 第九章,XQuery 第十章,性能问题 第十一章 Web服务案例分析:电子商务引擎设计

    ADO.NET中使用XML

    System.Xml.XmlReader myReader; ... myReader = mySqlCommand.ExecuteXmlReader(); DataSet DataSet myDataSet = new DataSet(); 读 myDataSet.ReadXml("C:\myData.XML"); 结构 myDataSet.ReadXmlSchema("C:\...

    .NET使XML串行化易如反掌

    XmlDocument 类能让你像处理文件一样处理XML 数据, 而XmlReader, XmlWriter, 和它们的派生类使你能够将XML 数据做为数据流处理. XmlSerializer 则提供了另外的方法, 它使你能够将自己的对象串行和反串行化为XML. ...

    php解析xml 的四种简单方法(附实例)

    XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument。 1。 XML Expat Parser: XML Parser使用Expat XML解析...

    php 解析xml 的四种方法详细介绍

    XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument。 1。 XML Expat Parser: XML Parser使用Expat XML...

    Java下XML的解析

    :个人理解类似.net的XmlDocument,解析的时候效率不高,占用内存,不适合大XML的解析;:基于事件的解析,当解析到xml的某个部分的时候,会触发特定事件,可以在自定义的解析类中定义当事件触发时要做得事情;个人...

    php读取xml文件类.zip

    提供一款php xml读取类,很简单的一个xml分析类了,它可读取指它xml文档,并且输出或取得指定节点的xml数据,本xml类代码是利用了php domdocument来解析xml文档。

    Web.xml文件配置JDOM對XML文件操作

    package com.common.xml;... Document document=sAXBuilder.build(xmlFile); element=document.getRootElement().getChild(firstChild); }catch(Exception e){ e.printStackTrace(); } return element; } }

    XML高级编程 完整目录版 part2

    第三章,XmlDocument 第四章,XPath 第五章,转换 第六章,ADO.NET 第七章,SQL Server 2000 和SqlXml 托管类 第八章,电子商务和XML 第九章,XQuery 第十章,性能问题 第十一章 Web服务案例分析:电子商务引擎设计

    XML高级编程 完整目录版 part1

    第三章,XmlDocument 第四章,XPath 第五章,转换 第六章,ADO.NET 第七章,SQL Server 2000 和SqlXml 托管类 第八章,电子商务和XML 第九章,XQuery 第十章,性能问题 第十一章 Web服务案例分析:电子商务引擎设计

    XML - 报表数据的新大陆.rar

    对于.NET平台,使用System.Xml.XmlDocument对象来使用DOM方式处理XML文档,而使用XmlReader 来使用流模式处理XML文档。 W3C国际标准组织设计XML文档的目标是方便的存储和交换小型数据包,而不考虑数据的冗余。因此...

Global site tag (gtag.js) - Google Analytics