65.9K
CodeProject 正在变化。 阅读更多。
Home

高级 XPath 分析器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.07/5 (9投票s)

2003年12月17日

2分钟阅读

viewsIcon

116403

downloadIcon

1289

一个高级的XPath查询分析器,基于Enrico Elizar Samuel的工作。这个高级版本支持命名空间解析。

引言

这是由Enrico Elizar Samuelhttps://codeproject.org.cn/aspnet/xpathanalyzer.asp)编写的优秀的XPath分析器的增强版本。高级XPath分析器已用C#重写,并支持命名空间解析和导航。

关于代码的说明

与原始XPath分析器的主要区别在于,您可以使用限定名称在XML文档中导航。 也可以在XML文档中有一个默认的命名空间。 在这种情况下,命名空间前缀将是def,以便您可以在xpath表达式中使用它。

例如,假设我们有一个XML文档,看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<items link="~/Html/Default.htm" xmlns=http://site/menu 
    xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
    xsi:schemalocation="http://site/menu menu.xsd">
    <item title="Products" link="#">
        <item title="Product 1" link="#"/>
        <item title="Product 2" link="#"/>
        <item title="Product 3" link="#"/>
        <item title="Product 4" link= "#"/>
    </item>
    <item title="Services" link="#">
        <item title="Service 1" link="#" />
        <item title="Service 2" link="#" />
    </item>
    <item title="People" link="#"/>
    <item title="Opening Hours" link="#"/>
    <item title="Prices" link="#"/>
    <item title="Contacts" link="#"/>
</items>

也就是说,正如您可能已经猜到的,这是一个简单网站的导航菜单。 如果您需要获取“Product 3”链接,您应该编写一个XPath查询,例如

/items/item[@title='Products']

但是这个查询不会给出任何结果! 这是因为您需要指定元素itemsitem属于默认的命名空间http://site/menu,事实上确实如此,否则解析器会理解它们没有与任何命名空间关联。
因此,正确的查询是

/def:items/def:item[@title='Products']

为了正确运行此查询,您首先需要定义前缀def 指向默认的命名空间URI。 使用高级XPath分析器,您可以手动添加命名空间或让其自动检测,但在幕后真正发生了什么呢?
需要三个步骤才能使XPath查询正确运行

  1. 定义一个XmlNamespaceManager,其中包含所有需要的命名空间
  2. 创建一个XPathExpression,其中包含相关的XPath表达式
  3. 将创建的XmlNamespaceManager对象分配给该XPathExpression

实际上,这意味着要编写类似这样的代码

XmlNamespaceManager namespaceManager = 
    new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace(prefix, uri);
XPathExpression expression = navigator.Compile(xpathQuery);
expression.SetContext(namespaceManager);

其中prefixuri是包含相关值的变量,而navigator是用于在文档中导航的XPathNavigator

使用程序

您必须指定XML源文件(可以是在硬盘上的文件或Web上的某个文件),然后指定您要测试的XPath查询。 您还可以指定SQLXML URL,以便您可以测试您的SQLXML查询。 如果您的XML使用命名空间,您必须在左侧面板中添加它,以便您可以在XPath查询中使用它们,否则您可以自动检测它,点击“检测命名空间”按钮。 当然,请记住在分析XPath查询*之前*执行此操作!

XML文档的位置

https:///nwind/schema/schema1.xsd/Employees?root=root

XPath查询

//root/Employees

历史

  • v 1.0:第一个版本
  • v 1.1:添加了自动命名空间发现
© . All rights reserved.