高级 XPath 分析器






4.07/5 (9投票s)
2003年12月17日
2分钟阅读

116403

1289
一个高级的XPath查询分析器,基于Enrico Elizar Samuel的工作。这个高级版本支持命名空间解析。
引言
这是由Enrico Elizar Samuel(https://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']
但是这个查询不会给出任何结果! 这是因为您需要指定元素items
和item
属于默认的命名空间http://site/menu
,事实上确实如此,否则解析器会理解它们没有与任何命名空间关联。
因此,正确的查询是
/def:items/def:item[@title='Products']
为了正确运行此查询,您首先需要定义前缀def
指向默认的命名空间URI。 使用高级XPath分析器,您可以手动添加命名空间或让其自动检测,但在幕后真正发生了什么呢?
需要三个步骤才能使XPath查询正确运行
- 定义一个
XmlNamespaceManager
,其中包含所有需要的命名空间 - 创建一个
XPathExpression
,其中包含相关的XPath表达式 - 将创建的
XmlNamespaceManager
对象分配给该XPathExpression
实际上,这意味着要编写类似这样的代码
XmlNamespaceManager namespaceManager =
new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace(prefix, uri);
XPathExpression expression = navigator.Compile(xpathQuery);
expression.SetContext(namespaceManager);
其中prefix
和uri
是包含相关值的变量,而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:添加了自动命名空间发现