XML篇查询语言XPath

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

             XPath表达式示例
• ./Order将找到当前上下文中名为Order的所有元素
• /Order将找到文档树中根下所有名为Order的元素
• //Order将在文档树的任何地方找到所有名为Order的元素,不管深度或层次结构
• child::book[attribute::publisher
=‘张三’]
• child::book[@publisher=‘张三’]
• descendent::book[count(child::chapter)>5]:用
count函数检索所有chapter大于5的后代book节点
• child::book[start-with(attribute::publisher,’张’)]:使
用start-with函数检索所有publisher属性以’张’开头
的book子节点.

XPath缩略语法
• //代表后代轴
• @代表属性轴
• .代表自己
• ..代表父节点

所需查询的XML

<?xml version="1.0" encoding="utf-8" ?>
<Orders>
  
<Customer Name='Albert'>
    
<Order Quantity="12">
      Roast Duck
    
</Order>
    
<Order Quantity="5">
      Red Wine
    
</Order>
  
</Customer>
  
<Customer Name='John'>
    
<Order Quantity="3">
      French Fries
    
</Order>
    
<Order Quantity="4">
      Coffee
    
</Order>
  
</Customer>
  
<Customer Name='Stephen'>
    
<Order Quantity="5">
      Milk
    
</Order>
  
</Customer>
  
<Customer Name='Alice'>
    
<Order Quantity="18">
      Frozen Pizza
    
</Order>
    
<Order Quantity="3">
      Potato Chips
    
</Order>
  
</Customer>
</Orders>


程序:
 
protected void Page_Load(object sender, EventArgs e)
        
{
            XmlDocument xmlDocument 
= new XmlDocument();
            
            
//Load Xml
            xmlDocument.Load(Server.MapPath("Test.xml"));

            
//查询Name为A开头的节点
            XmlNodeList xmlNodeList = xmlDocument.DocumentElement.SelectNodes("//Customer[starts-with(@Name,'A')]/Order");

            
//总共找到几个Node
            Response.Write("Found:" + xmlNodeList.Count.ToString() + "node<br>");

            
foreach (XmlNode xmlNode in xmlNodeList)
            
{
                
//取得Name节点的Value
                string parentNodeAttribute = xmlNode.ParentNode.Attributes.GetNamedItem("Name").Value;
                
//取得Quantity的Value
                string elementAttribute = xmlNode.Attributes.GetNamedItem("Quantity").Value;
                
//显示
                Response.Write("Customer Name:" + parentNodeAttribute + "Ordered Quantity:" + elementAttribute + "" + xmlNode.InnerText + "<br>");
            }

        }
原文地址:https://www.cnblogs.com/RuiLei/p/647603.html