相关文章推荐

本文介绍如何使用从 XPathDocument 对象创建的 XPathNavigator 对象导航 XML 文档。

原始产品版本: Visual C#
原始 KB 编号: 308343

此示例使用 XML 数据加载 XPathDocument 对象,在数据上创建 XPathNavigator 对象作为视图,并通过浏览文档来显示 XML。

本文引用以下 Microsoft .NET Framework类库命名空间:

  • System.Xml
  • System.Xml.XPath
  • 有关本文的 Microsoft Visual Basic .NET 版本,请参阅 如何使用 Visual Basic 通过 XPathNavigator 类导航 XML

    本文假设你熟悉以下主题:

  • Visual C#
  • XML 术语
  • 创建和读取 XML 文件
  • XML 路径语言 (XPath) 语法
  • 如何使用 XPathNavigator 类导航 XML

  • 在 Visual Studio 中创建新的 Visual C# 控制台应用程序。

    本示例使用名为 Books.xml 的文件。 可以创建自己的 Books.xml 文件,也可以使用 .NET 软件开发工具包 (SDK) 快速入门中包含的示例。 如果未安装快速入门并且不想安装这些快速入门,请参阅 Books.xml 下载位置 的“参考” 部分。 如果安装了快速入门, Books.xml 位于以下文件夹中:
    \Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB

    可以将 Books.xml 复制到 \Bin\Debug 创建此项目的文件夹下的文件夹。

  • 确保项目引用 System.Xml 命名空间。

  • using 在命名空间和 XPath 命名空间上 Xml 使用该语句,这样你就不需要在代码后面的这些命名空间中限定声明。 可以在任何其他声明之前使用该 using 语句,如下所示:

    using System.Xml;
    using System.Xml.XPath;
    
  • 声明相应的变量。 声明用于 XPathDocument 保存 XML 文档的对象和 XPathNavigator 用于评估 XPath 表达式并移动文档的对象。 声明要 String 保存表达式的 XPath 对象。 在 Module1 中的过程中 Main 添加声明代码。

    XPathNavigator nav;
    XPathDocument docNav;
    
  • 加载具有 XPathDocument 示例文件 Books.xml的对象。 该 XPathDocument 类使用可扩展样式表语言转换 (XSLT) 为 XML 文档处理提供快速且面向性能的缓存。 它类似于 XML 文档对象模型 (DOM) 但针对 XSLT 处理和 XPath 数据模型进行了高度优化。

    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
    
  • XPathNavigator从文档创建对象。 XPathNavigator 使你可以在 XML 文档中同时移动属性节点和命名空间节点。

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  • 使用该方法移动到文档的 MoveToRoot 根目录。 MoveToRoot 将导航器设置为包含整个节点树的文档节点。

    //Initial XPathNavigator to start at the root.
    nav.MoveToRoot();
    
  • 使用该 MoveToFirstChild 方法移动到 XML 文档的子级。 该 MoveToFirstChild 方法移动到当前节点的第一个子节点。 如果有 Books.xml 源,则会从根文档移到子级文档、“批注”部分和“书店”节点。

    //Move to the first child node (comment field).
    nav.MoveToFirstChild();
    
  • 使用该 MoveToNext 方法循环访问同级节点。 该 MoveToNext 方法移动到当前节点的下一个同级。

    //Loop through all of the root nodes.
    } while (nav.MoveToNext());
    
  • 使用该 NodeType 属性可确保仅处理元素节点,并使用该 Value 属性显示元素的文本表示形式。

    //Find the first element. if (nav.NodeType == XPathNodeType.Element) //Determine whether children exist. if (nav.HasChildren == true) //Move to the first child. nav.MoveToFirstChild(); //Loop through all the children. //Display the data. Console.Write("The XML string for this child "); Console.WriteLine("is '{0}'", nav.Value); } while (nav.MoveToNext()); } while (nav.MoveToNext());
  • 使用该 HasAttributes 属性确定节点是否具有任何属性。 还可以使用其他方法(例如 MoveToNextAttribute)移动到属性并检查其值。

    此代码段仅遍历根节点的后代,而不是整个树。

    //Find the first element. if (nav.NodeType == XPathNodeType.Element) //if children exist if (nav.HasChildren == true) //Move to the first child. nav.MoveToFirstChild(); //Loop through all the children. //Display the data. Console.Write("The XML string for this child "); Console.WriteLine("is '{0}'", nav.Value); //Check for attributes. if (nav.HasAttributes == true) Console.WriteLine("This node has attributes"); } while (nav.MoveToNext()); } while (nav.MoveToNext());
  • ReadLine使用对象的方法Console在控制台显示的末尾添加暂停,以便更轻松地显示上述结果。

    //Pause.
    Console.ReadLine();
    
  • 生成并运行 Visual C# 项目。

    完整代码列表

    using System;
    using System.Xml;
    using System.Xml.XPath;
    namespace q308343
        class Class1
            static void Main(string[] args)
                XPathNavigator nav;
                XPathDocument docNav;
                docNav = new XPathDocument(@"c:\books.xml");
                nav = docNav.CreateNavigator();
                nav.MoveToRoot();
                //Move to the first child node (comment field).
                nav.MoveToFirstChild();
                    //Find the first element.
                    if (nav.NodeType == XPathNodeType.Element)
                        //Determine whether children exist.
                        if (nav.HasChildren == true)
                            //Move to the first child.
                            nav.MoveToFirstChild();
                            //Loop through all of the children.
                                //Display the data.
                                Console.Write("The XML string for this child ");
                                Console.WriteLine("is '{0}'", nav.Value);
                                //Check for attributes.
                                if (nav.HasAttributes == true)
                                    Console.WriteLine("This node has attributes");
                            } while (nav.MoveToNext());
                } while (nav.MoveToNext());
                //Pause.
                Console.ReadLine();
    

    测试代码时,可能会收到以下异常错误消息:

    类型System.Xml的未经处理的异常。XmlException 发生在system.xml.dll
    其他信息:意外的 XML 声明。 XML 声明必须是文档中的第一个节点,并且不允许在文档之前显示空格字符。 第 1 行,位置

    以下代码行出现异常错误:

    docNav = new XPathDocument("c:\\books.xml");
    

    若要解决此错误,请删除books.xml文档中第一个节点之前的空白字符 () 。

  • 立即下载Books.xml

  • XPathNavigator 类

  • XPathDocument 类

  • XPath 示例

  • XML 路径语言 (XPath) 版本 1.0 W3C 建议 1999 年 11 月 16 日

  •  
    推荐文章