如何使用 XPath 表达式查询 XML
此示例阐释如何使用提供给 XPathNavigator 类的 W3C XML 路径语言 (XPath) 表达式查询 XPathDocument。XPathNavigator 类仅用于对文档进行只读 XPath 查询,而对于可扩展样式表语言转换 (XSLT) 处理,则由 XslTransform 类实现。对于 XSLT,不需要创建 XPathNavigator。
注意:XPath 是 W3C 的通用查询语言规范,用于对 XML 文档的某些部分进行寻址。XPath 的 .NET 框架实现符合 WWW 联合会 (W3C) XML 路径语言 (XPath) 1.0 版规范。
要使用 XSLT 对 XML 文档进行快速和高效的处理,请使用 XPathDocument 类。可以认为 XPathDocument 类与 XML DOM 相似,但前者为 XSLT 处理及 XPath 数据模型进行了高度优化。然而,与 W3C XML DOM 类不同的是,XPathDocument 类不维护节点标识,也不执行 DOM 类所要求的所有规则和验证检查。
您也可以针对 XmlDocument 或 XmlDataDocument 类执行 XPath 查询。如果您使用这两个类中的一个,则需要使用 XmlNode 类的 SelectNodes 和 SelectSingleNode 方法。
VB QueryXmlDocumentXPath.aspx
此示例加载一个包含示例文件 books.xml 的 XPathDocument。然后,该示例将 XPath 表达式传递给 XPathQuery 函数。要传递的第一个 XPath 表达式选择从根节点开始的所有书籍元素节点的所有价格节点。第二个 XPath 表达式获取从根节点开始的、与最后的书籍元素节点关联的 ISBN 属性节点的文本。
要选择与给定 XPath 表达式匹配的节点,XPathQuery 函数使用 XPathNavigator 的 Select 方法。然后,该函数创建一个 XPathNodeIterator,并使用此迭代程序重复定位某个节点并把该节点显示在屏幕上。
注意:因为 XPathNodeIterator 表示一个 XPath 节点集,所以 XPathNodeIterator 支持在此节点集上的操作。
td.code {
padding:0,10,0,10;
border-style:solid;
border-width:1;
border-bottom:0;
border-top:0;
border-right:0;
border-color:cccccc;
background-color:ffffee
}
td.tab {
text-align:center;
font:8pt verdana;
width:15%;
padding:3,3,3,3;
border-style:solid;
border-width:1;
border-right:0;
border-color:black;
background-color:eeeeee;
cursor:hand
}
td.backtab {
text-align:center;
font: 8pt verdana;
width:15%;
padding:3,3,3,3;
border-style:solid;
border-width:1;
border-right:0;
border-color:black;
background-color:cccccc;
cursor:hand
}
td.space {
width:70%;
font: 8pt verdana;
padding:0,0,0,0;
border-style:solid;
border-bottom:0;
border-right:0;
border-width:1;
border-color:cccccc;
border-left-color:black;
background-color:white
}
private const String localURL = "http://localhost/quickstart/howto/samples/Xml/QueryXmlDocumentXPath/cs/books.xml";
public static void Main()
{
QueryXmlDocumentXPathSample myQueryXmlDocumentXPathSample = new QueryXmlDocumentXPathSample();
myQueryXmlDocumentXPathSample.Run(localURL);
}
public void Run(String args)
{
Console.WriteLine("XPath Test started ...");
XPathDocument myXPathDocument = new XPathDocument(args);
XPathNavigator myXPathNavigator = myXPathDocument.CreateNavigator();
// Get all the book prices
XPathQuery(myXPathNavigator, "descendant::book/price");
// Get the ISBN of the last book
XPathQuery(myXPathNavigator, "bookstore/book[3]/@ISBN");
}
private void XPathQuery(XPathNavigator myXPathNavigator, String xpathexpr )
{
try
{
Console.WriteLine("XPath query: " + xpathexpr);
// Create a node interator to select nodes and move through them (read-only)
XPathNodeIterator myXPathNodeIterator = myXPathNavigator.Select (xpathexpr);
while (myXPathNodeIterator.MoveNext())
{
Console.WriteLine("<" + myXPathNodeIterator.Current.Name + "> " + myXPathNodeIterator.Current.Value);
}
Console.WriteLine();
}
catch (Exception e)
{
Console.WriteLine ("Exception: {0}", e.ToString());
}
}
private const localURL as String = "http://localhost/quickstart/howto/samples/Xml/QueryXmlDocumentXPath/cs/books.xml"
Shared sub Main
Dim myQueryXmlDocumentXPathSample as QueryXmlDocumentXPathSample
myQueryXmlDocumentXPathSample = new QueryXmlDocumentXPathSample()
myQueryXmlDocumentXPathSample.Run(localURL)
end sub
public sub Run(args as String)
Console.WriteLine("XPath Test started ...")
Dim myXPathDocument as XPathDocument = new XPathDocument(args)
Dim myXPathNavigator as XPathNavigator = myXPathDocument.CreateNavigator()
' Get all the book prices
XPathQuery(myXPathNavigator, "descendant::book/price")
' Get the ISBN of the last book
XPathQuery(myXPathNavigator, "bookstore/book[3]/@ISBN")
end sub
private sub XPathQuery(myXPathNavigator as XPathNavigator, xpathexpr as String )
try
Console.WriteLine("XPath query: " + xpathexpr)
' Create a node interator to select nodes and move through them (read-only)
Dim myXPathNodeIterator as XPathNodeIterator = myXPathNavigator.Select (xpathexpr)
while (myXPathNodeIterator.MoveNext())
Console.WriteLine("<" & myXPathNodeIterator.Current.Name + "> " & myXPathNodeIterator.Current.Value)
end while
Console.WriteLine()
catch e as Exception
Console.WriteLine ("Exception: {0}", e.ToString())
end try
end sub
C#
VB
第一个查询选择从根节点开始的所有书籍的“价格”节点。第二个查询获取从根节点开始的最后的书籍元素节点的“ISBN”属性文本。
也可使用 XPathExpression 类执行查询。使用 XPathExpression 类而不使用 Select 方法(在 XPathNavigator 上)中的字符串表达式的原因主要有两个:
1) 表达式只编译一次,并可重复使用多次,这样可提高性能
2) 可使用 XmlNamespaceManager 类将 XPath 表达式中使用的前缀绑定到某个命名空间,这样当选择一组节点时,就允许使用带前缀的 XPath 表达式。
下列代码显示一般用法,即选择其 ISBN 属性在 urn:samples 命名空间中的所有书籍。
// compile the expression
XPathExpression expr = nav.Compile("book/@mybk:ISBN");
// set namespace(s) used in the expression
XmlNamespaceManager mngr = new XmlNamespaceManager(new NameTable());
mngr.AddNamespace("mybk","urn:samples");
expr.SetContext(mngr);
// select the nodes
XPathNodeIterator myXPathNodeIterator = nav.Select(expr);
' compile the expression
Dim expr as XPathExpression = nav.Compile("book/@mybk:ISBN")
' set namespace(s) used in the expression
Dim mngr as XmlNamespaceManager = new XmlNamespaceManager(new NameTable())
mngr.AddNamespace("mybk","urn:samples")
expr.SetContext(mngr)
' select the nodes
Dim myXPathNodeIterator as XPathNodeIterator = nav.Select(expr)
C#
VB
如果 XPathExpression 没有前缀,则假设该命名空间 URI 为空的命名空间。如果 XML 包括默认的命名空间,则必须仍然使用 SetContext 方法,并提供一个包含前缀和命名空间 URI 的 XmlNamespaceManager,以处理默认命名空间。有关使用 XmlNamespaceManager 的更多信息,请参阅“XmlNameSpace 管理器与命名表”主题。
摘要
要查询 XPathDocument、XmlDataDocument 或 XmlDocument,可以为 XPathNavigator 类提供 XPath 表达式。
XPathNavigator 类仅用于对 XML 文档进行只读 XPath 查询。
XPathDocument 类为使用 XSLT 处理 XML 文档提供快速、高效的特定缓存。
版权所有 2001 Microsoft Corporation。保留所有权利。