如何使用 XmlNodeReader

此示例阐释如何创建和使用 XmlNodeReader。XmlNodeReader 是一种读取器,可提供对 XmlNode 中的 XML 数据的快速、非缓存和只进的访问。它能够读取整个 XML DOM 树,或只从子树读取。然而,XmlNodeReader 不支持文档类型定义 (DTD) 或架构验证,因此不验证它读取的 XML。

此示例将 books.xml 加载到 XmlDocument 中,然后使用 XmlNodeReader 获取每个节点以及它们各自的值,以将这些值显示在屏幕上。

  XML文档对象模型----使用XmlNodeReader
VB XmlNodeReader.aspx

[运行示例] | [查看源代码]

创建 XmlDocument 并将 books.xml 文件加载到其中后,该示例创建一个 XmlNodeReader,它可选择 XmlDocument 中的单个节点。该示例将此 XmlNodeReader 传递到 FormatXml 函数,该函数将节点数据输出到屏幕上。然后,该示例创建另一个 XmlNodeReader,它选择不同的节点以输出到屏幕上。

XmlDocument myXmlDocument = new XmlDocument();
            myXmlDocument.Load (arg);
            ...
            XmlNodeReader myXmlNodeReader = new XmlNodeReader (myXmlDocument.SelectSingleNode("bookstore/book[3]"));
            FormatXml (myXmlNodeReader);
            ...
            myXmlNodeReader = new XmlNodeReader (myXmlDocument.SelectSingleNode("bookstore/book[2]"));
            myXmlNodeReader.Read();
            Console.WriteLine (myXmlNodeReader.ReadInnerXml());
            
Dim myXmlDocument as XmlDocument  = new XmlDocument()
            myXmlDocument.Load (arg)
            ...
            Dim myXmlNodeReader as XmlNodeReader  = new XmlNodeReader (myXmlDocument.SelectSingleNode("bookstore/book[3]"))
            FormatXml (myXmlNodeReader)
            ...
            myXmlNodeReader = new XmlNodeReader (myXmlDocument.SelectSingleNode("bookstore/book[2]"))
            myXmlNodeReader.Read()
            Console.WriteLine (myXmlNodeReader.ReadInnerXml())
            
C# VB  

该部分示例仅使用 XmlNodeReader 的 Read 方法读取每个节点,然后根据节点类型,使用 Format 函数将节点输出到屏幕上。

private static void FormatXml (XmlNodeReader reader)
            {
            while (reader.Read())
            {
            switch (reader.NodeType)
            {
            case XmlNodeType.ProcessingInstruction:
            Format (reader, "ProcessingInstruction");
            break;
            case XmlNodeType.DocumentType:
            Format (reader, "DocumentType");
            break;
            case XmlNodeType.Document:
            Format (reader, "Document");
            break;
            case XmlNodeType.Comment:
            Format (reader, "Comment");
            break;
            case XmlNodeType.Element:
            Format (reader, "Element");
            while(reader.MoveToNextAttribute())
            {
            Format (reader, "Attribute");
            }
            break;
            case XmlNodeType.Text:
            Format (reader, "Text");
            break;
            case XmlNodeType.Whitespace:
            Format (reader, "Whitespace");
            break;
            }
            }
            }
            // Format the output
            private static void Format(XmlNodeReader reader, String NodeType)
            {
            // Format the output
            for (int i=0; i < reader.Depth; i++)
            {
            Console.Write('\t');
            }
            Console.Write(NodeType + "<" + reader.Name + ">" + reader.Value);
            Console.WriteLine();
            }
            
private sub FormatXml (reader as XmlNodeReader)
            while (reader.Read())
            select case reader.NodeType
            case XmlNodeType.ProcessingInstruction:
            Format (reader, "ProcessingInstruction")
            case XmlNodeType.DocumentType:
            Format (reader, "DocumentType")
            case XmlNodeType.Document:
            Format (reader, "Document")
            case XmlNodeType.Comment:
            Format (reader, "Comment")
            case XmlNodeType.Element:
            Format (reader, "Element")
            while (reader.MoveToNextAttribute())
            Format (reader, "Attribute")
            end while
            case XmlNodeType.Text:
            Format (reader, "Text")
            case XmlNodeType.Whitespace:
            Format (reader, "Whitespace")
            end select
            end while
            end sub
            'Format the output
            private sub Format (reader as XmlNodeReader, NodeType as String)
            Dim value as String = System.String.Empty
            Dim i as long
            for i=0  to (reader.Depth - 1)
            Console.Write(Chr(9))
            Next
            if (reader.HasValue)
            value = reader.Value
            end if
            Console.WriteLine(NodeType & "<" & reader.Name & ">" + value)
            end sub
            
C# VB  

摘要

  1. XmlNodeReader 是提供对 XmlNode 中的 XML 数据进行快速、非缓存和只进的访问的读取器。
  2. 因为也可使用 XmlDocument 中的任何 XmlNode 构造 XmlNodeReader,所以 XmlNodeReader 可提供只读取给定节点的子树的读取器。

相关文章: