文章编号: 313188 - 最后修改: 2002年2月24日 - 修订: 1.0

HOW TO: 使用 Visual C# .NET 在 XPath 查询中指定完全限定的元素名称

本文的发布号曾为 CHS313188

本页

展开全部 | 关闭全部

概要

本文介绍如何通过指定命名空间前缀:元素名 格式的完全限定元素名在 XmlDocument 对象中选择节点。

创建 XML 文件

  1. 在 Windows 开始菜单上,指向运行,键入 notepad.exe,然后单击确定以打开记事本。 复制以下代码并将其粘贴到记事本中:
    <?xml version='1.0' encoding='utf-16'?>
       <bk:Books xmlns:bk='http://myserver/myschemas/Books'>
         <bk:Book>
             <bk:Title>Just XML</bk:Title>
         </bk:Book>
         <bk:Book>
             <bk:Title>Professional XML</bk:Title>
         </bk:Book>
         <bk:Book>
             <bk:Title>XML Step by Step</bk:Title>
         </bk:Book>
         <bk:Book>
             <bk:Title>XML By Example</bk:Title>
         </bk:Book>
       </bk:Books>
  2. 复制以下代码并将其粘贴到记事本中: 在文件菜单上,单击保存
  3. 复制以下代码并将其粘贴到记事本中: 在另存为对话框的保存类型文本框中,键入所有文件。 在文件名文本框中,键入 Books.xml,然后单击确定

创建 Visual C# .NET 项目

下面的代码示例使用以下对象和类:
  • XPathNavigator 类: XPathNavigator 基于 XML 路径语言 (XPath) 数据模型,该类提供对任何数据存储区实现 XPath 查询所需要的方法。
  • XPathExpression 类: 该类封装已编译的 XPath 表达式,在调用 Compile 时会返回该类。 SelectEvaluateMatches 方法使用该类。
  • XmlNamespaceManager 类: XmlNamespaceManager 用于解析命名空间,向集合添加命名空间,以及从集合删除命名空间。 XmlNamespaceManager 还为这些命名空间提供范围管理。 因为 Books.xml 在代码中使用下面的“bk”命名空间,所以您必须使用 XmlNamespaceManager
  • XPathNodeIterator 类: 该对象提供对一组选定节点的迭代程序。
若要创建并运行 Visual Basic .NET 项目,请按下列步骤操作:
  1. 在 Visual C# .NET 中新建一个 Windows 应用程序项目。默认情况下会将 Form1 添加到项目中。
  2. 将一个 Button 控件和一个 TextBox 控件放到 Form1 上。
  3. TextBox 控件的 MultiLine 属性设置为 True
  4. 单击以展开 TextBox 控件,以便查看四到五行数据。
  5. 将下面的代码添加到“代码”窗口顶部:
    using System.Xml;
    using System.Xml.XPath;
  6. 若要将 Books.xml file 文件加载到 XmlDocument 对象中,请将下面的代码添加到 Button 对象的 Click 事件中。
    XmlDocument oxmldoc = new XmlDocument();
    oxmldoc.Load(@"c:\Books.xml");
  7. 确保前面代码中的 Books.xml 路径指向计算机上的正确路径。
  8. 使用 XmlDocument 对象的 CreateNavigator 方法创建 XPathNavigator 对象,以便运行 XPath 查询:
    XPathNavigator oXPathNav;
    oXPathNav = oxmldoc.CreateNavigator();
  9. 使用 XPathNavigatorCompile 方法创建 XPathExpression 类,然后传递 XPath 查询作为参数:
    XPathExpression Expr;
    Expr = oXPathNav.Compile("//bk:Book[position()>=2]");
  10. 使用 AddNamespace 方法向 XmlNamespaceManager 对象添加“bk”命名空间:
    XmlNamespaceManager(oXPathNav.NameTable);
    oxmlNSManager.AddNamespace("bk", "http://myserver/myschemas/Books");
  11. 使用 XPathExpressionSetContext 方法将 XPathExpression 上下文设置为 XmlNamespaceManager
    Expr.SetContext(oxmlNSManager);
  12. 若要运行 XPath 查询并返回选定的节点,请将表达式传递给 XPathNodeIteratorSelect 方法:
    XPathNodeIterator iterator = oXPathNav.Select(Expr);
    while (iterator.MoveNext())				
    {
    	this.textBox1.Text = this.textBox1.Text + "\r\n"+ iterator.Current.Value ;
    }
  13. Button1_Click 事件中的代码应显示如下:
    XmlDocument oxmldoc = new XmlDocument();
    try	
    { 
    oxmldoc.Load("c:\\Books.xml");
    
    XPathNavigator oXPathNav;
    oXPathNav = oxmldoc.CreateNavigator();
    
    XPathExpression Expr;
    Expr = oXPathNav.Compile("//bk:Book[position()>=2]");
    
    XmlNamespaceManager oxmlNSManager = new XmlNamespaceManager(oXPathNav.NameTable);
    oxmlNSManager.AddNamespace("bk", "http://myserver/myschemas/Books");
    Expr.SetContext(oxmlNSManager);
    
    XPathNodeIterator iterator = oXPathNav.Select(Expr);
    				 
    while (iterator.MoveNext())				
    {
    	this.textBox1.Text = this.textBox1.Text + "\r\n"+ iterator.Current.Value ;
    }
                
    oxmlNSManager = null;
    oXPathNav = null;
    oxmldoc = null;
    }
    catch (Exception exc)
    {
            MessageBox.Show(exc.Message);
    }
  14. 生成并运行该项目。
  15. 单击 Button1。 注意,文本框中将出现一个书籍列表,这些书的位置大于或等于 2。

参考

有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中的文章:
280457? (http://support.microsoft.com/kb/280457/EN-US/ ) PRB: Specifying Fully Qualified Element Names in XPath Queries(在 XPath 查询中指定完全限定的元素名称)

这篇文章中的信息适用于:
  • Microsoft Visual C# .NET 2002 标准版
关键字:?
kbhowto kbhowtomaster kbmsxml KB313188
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润负任何责任。
 

文章翻译