XML篇--查询语言XPath

本文介绍XPath的基本概念及其在XML文档查询中的应用,包括位置步、轴、节点测试等关键语法,并提供示例展示如何使用XPath表达式进行精确的数据提取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

None.gifXPath
None.gif• XPath(XML 路径语言)是用来查询和定位XML文档里的元素以及文本的一种通用查询方法。
None.gif• 许多人将XPath看作Internet的SQL语言。
None.gif• XPath语法使用称为表达式的模式。初始化时结果集中没有任何东西,利用XPath表达式使得出现在结果集里的节点形成特定的层次结构并符合一定的条件。
None.gif• XPath上下文:是我们将要查询文档的文档树中一个特定的节点。可以认为是查询的一个起始点。
None.gif             
None.gif                 XPath表达式
None.gif• 由位置步组成。它由一个轴、一个节点测试和可选择的一系列谓词构成。通过使用反斜杠连接多个位置步形成位置路径,产生一组节点作为结果。
None.gif• /Books/book/title:要求元素Books的子元素book的所有子元素title。
None.gif• /Books/book[@Price
<21.99]/title:返回Books根元素下book子元素中,所有Price属性值小于21.99的book的所有title子元素
None.gif• 位置步:表达式中由反斜杠分开的每个部分被称为一个位置步。
None.gif• 轴:是与上下文节点相对的文档的一部分,它定义了一组与当前节点有特定层次关系的节点。
None.gif• 节点测试:可以用来指示位置路径中一组合法节点的任何表达式。节点测试通过名字或类型筛选初始结果集。
None.gif– child::text():返回所有文本子节点。
None.gif• 谓词:true或false的一个表达式。
None.gif                  
None.gif                   轴
None.gif• 轴心包括:self、child、parent、descendent、ancestor、attribute、namespace、following、preceding
None.gif• child::Customer:返回当前节点子元素中的所有Customer元素
None.gif• descendent::OrderItem:返回节点名为OrderItem“的所有后代
None.gif
None.gif             XPath表达式示例
None.gif• ./Order将找到当前上下文中名为Order的所有元素
None.gif• /Order将找到文档树中根下所有名为Order的元素
None.gif• //Order将在文档树的任何地方找到所有名为Order的元素,不管深度或层次结构
None.gif• child::book[attribute::publisher
=‘张三’]
None.gif
• child::book[@publisher=‘张三’]
None.gif
• descendent::book[count(child::chapter)>5]:用
None.gifcount函数检索所有chapter大于5的后代book节点
None.gif• child::book[start-with(attribute::publisher,’张’)]:使
None.gif用start-with函数检索所有publisher属性以’张’开头
None.gif的book子节点.
None.gif
None.gifXPath缩略语法
None.gif• //代表后代轴
None.gif• @代表属性轴
None.gif• .代表自己
None.gif• ..代表父节点

None.gif所需查询的XML
None.gif
None.gif
<?xml version="1.0" encoding="utf-8" ?>
None.gif
<Orders>
None.gif  
<Customer Name='Albert'>
None.gif    
<Order Quantity="12">
None.gif      Roast Duck
None.gif    
</Order>
None.gif    
<Order Quantity="5">
None.gif      Red Wine
None.gif    
</Order>
None.gif  
</Customer>
None.gif  
<Customer Name='John'>
None.gif    
<Order Quantity="3">
None.gif      French Fries
None.gif    
</Order>
None.gif    
<Order Quantity="4">
None.gif      Coffee
None.gif    
</Order>
None.gif  
</Customer>
None.gif  
<Customer Name='Stephen'>
None.gif    
<Order Quantity="5">
None.gif      Milk
None.gif    
</Order>
None.gif  
</Customer>
None.gif  
<Customer Name='Alice'>
None.gif    
<Order Quantity="18">
None.gif      Frozen Pizza
None.gif    
</Order>
None.gif    
<Order Quantity="3">
None.gif      Potato Chips
None.gif    
</Order>
None.gif  
</Customer>
None.gif
</Orders>
None.gif
None.gif
None.gif程序:
None.gif 
protected void Page_Load(object sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif            XmlDocument xmlDocument 
= new XmlDocument();
InBlock.gif            
InBlock.gif            
//Load Xml
InBlock.gif
            xmlDocument.Load(Server.MapPath("Test.xml"));
InBlock.gif
InBlock.gif            
//查询Name为A开头的节点
InBlock.gif
            XmlNodeList xmlNodeList = xmlDocument.DocumentElement.SelectNodes("//Customer[starts-with(@Name,'A')]/Order");
InBlock.gif
InBlock.gif            
//总共找到几个Node
InBlock.gif
            Response.Write("Found:" + xmlNodeList.Count.ToString() + "node<br>");
InBlock.gif
InBlock.gif            
foreach (XmlNode xmlNode in xmlNodeList)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
//取得Name节点的Value
InBlock.gif
                string parentNodeAttribute = xmlNode.ParentNode.Attributes.GetNamedItem("Name").Value;
InBlock.gif                
//取得Quantity的Value
InBlock.gif
                string elementAttribute = xmlNode.Attributes.GetNamedItem("Quantity").Value;
InBlock.gif                
//显示
InBlock.gif
                Response.Write("Customer Name:" + parentNodeAttribute + "Ordered Quantity:" + elementAttribute + "" + xmlNode.InnerText + "<br>");
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值