• XPath语法


    XPath的语法:

    1. XPath中的符号

    符号

    说明

    示例

    示例说明

    /

    表示从根节点开始选择

    /pets

    选择根节点pets

    表示节点和子节点之间的间隔符

    /pets/dog

    选择pets节点下的dog节点

    //xx

    表示从整个xml文档中查找,而不考虑当前节点位置

    //price

    选择文档中所有的price节点

    .

    单个英文半角句点表示选择当前节点

    /pets/.

    选择pets节点

    ..

    双点,表示选择父节点

    /pets/dog[0]/..

    表示pets节点,也就是第一个dog节点的父节点

    @xx

    表示选择属性

    //dog/@color

    表示选择所有dog节点的color属性集合

    […]

    中括号表示选择条件,括号内为条件

    //dog[@color=’white’]

    所有color为white的dog节点

    //dog[/price<100]

    所有price字节点值小于100的dog节点

    中括号内数字为节点索引,类似c#等语言中的数组,数组下标是从1开始的

    //dog[1]

    第1个dog节点

    //dog[last()]

    最后一个dog节点,last()是xPath内置函数

    |

    单竖杠表示合并节点结合

    //dog[@color=’white’] | //cat[@color=’white’]

    color属性为white的dog节点和color属性为white的cat节点

    *

    星号表示任何名字的节点或者属性

    //dog/*

    表示dog节点的所有子节点

    //dog/@*

    表示dog节点的所有属性节点

    2. XPath数学运算符
    +  加号表示加
    - 表示数字相减
    * 表示乘以
    div 表示除以,这里数学上的除号/已经被用作节点之间分隔符了
    mod 表示取余
     
    3. XPath逻辑运算符
    = 等于,相当于c#中的 ==
    != 不等于
    > 大于
    >= 大于等于
    < 小于
    <= 小于等于
    and 并且 与关系
    or 或者 或关系
     
     
    4. XPath Axes 从字面翻译这个是XPath轴的意思,但根据我的理解这个翻译成XPath节点关系运算关键字更合适,就是一组关键字加上::双冒号表示和当前节点有关系的一个或者一组节点.
    使用语法: axisname::nodetest[predicate] 即轴名字::节点名字[取节点条件]
    具体说明如下:

    关键字

    说明

    示例

    示例说明

    ancestor

    当前节点的父祖节点

    ancestor::pig

    当前节点的祖先节点中的pig节点

    ancestor-or-self

    当前节点以及其父祖节点

    ancestor::pig

    attribute

    当前节点的所有属性

    attribute::weight

    相当于@weight,attribute::和@是等价的

    child

    当前节点的所有字节点

    child::*[name()!=’price’]

    选择名字不是price的子节点

    descendant

    子孙节点

    descendant::*[@*]

    有属性的子孙节点

    descendant-or-self

    子孙节点以及当前节点

    descendant-or-self::*

    following

    Xml文档中当前节点之后的所有节点

    following::*

    following-sibling

    当前节点的同父弟弟节点

    following-sibling::

    preceding

    Xml文档中当前节点之前的所有节点

    preceding::*

    namespace

    选取当前节点的所有命名空间节点

    namespace::*

    parent

    当前节点的父节点

    parent::

    相当于双点..

    preceding-sibling

    当前节点之后的同父兄节点

    preceding-sibling::*

    self

    当前节点

    self::*

    相当于单点.

     
    5. 常用的XPath函数介绍:
    在XPath表达式中常用的函数有下面两个:
    position() 表示节点的序号例如 //cat[position() = 2] 表示取序号为2的dog节点
    last() 表示取最后一个节点 //cat[last()] 
    name() 表示当前节点名字 /pets/*[name() != 'pig'] 表示/pets下名字不是pig的子节点
     
    XPath的函数还有很多,包括字符串函数,数字函数和时间函数等,具体可以参考w3的网站。
     
    以上是XPath的语法,下面我们看下如何在.Net中使用XPath
    在.Net中可以通过XPathDocument或者XmlDocument类使用XPath。XPathDocument是只读的方式定位Xml节点或者属性文本等,而XmlDocument则是可读写的。
     
    如下代码示例展示了如何使用XPathDocument和XmlDocument
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml.XPath;
    using System.Xml;
     
    namespace UseXPathDotNet
    {
        class Program
        {
            static void Main(string[] args)
            {
                UseXPathWithXPathDocument();
     
                UseXPathWithXmlDocument();
     
                Console.Read();
            }
     
            static void UseXPathWithXmlDocument()
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("http://www.cnblogs.com/yukaizhao/rss");
                //使用xPath选择需要的节点
                XmlNodeList nodes = doc.SelectNodes("/rss/channel/item[position()<=10]");
                foreach (XmlNode item in nodes)
                {
                    string title = item.SelectSingleNode("title").InnerText;
                    string url = item.SelectSingleNode("link").InnerText;
                    Console.WriteLine("{0} = {1}", title, url);
                }
            }
     
            static void UseXPathWithXPathDocument()
            {
                XPathDocument doc = new XPathDocument("http://www.cnblogs.com/yukaizhao/rss");
                XPathNavigator xPathNav = doc.CreateNavigator();
                //使用xPath取rss中最新的10条随笔
                XPathNodeIterator nodeIterator = xPathNav.Select("/rss/channel/item[position()<=10]");
                while (nodeIterator.MoveNext())
                {
                    XPathNavigator itemNav = nodeIterator.Current;
                    string title = itemNav.SelectSingleNode("title").Value;
                    string url = itemNav.SelectSingleNode("link").Value;
                    Console.WriteLine("{0} = {1}",title,url);
                }
     
            }
        }
    }

    具体参见:

    http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html

    http://www.cnblogs.com/loofah/archive/2012/05/10/2494036.html

     

    其它有用的示例:

    //节点InnerText的等值查询
    string xpath = "users/user[username='huo' and password='123']";
    //节点InnerText的模糊查询
    string xpath = "users/user[contains(username,'huo') and contains(password,'123')]";

    //属性的等值查询:
    string xpath = "users/user[@username='huo' and @password='123']";
    //属性的模糊查询:
    string xpath = "users/user[contains(@username,'huo') and contains(@password,'123')]";

    如果XPath的开头是一个斜线(/)代表这是绝对路径。如果开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。
    以下的语法会选出文件中所有叫做cd的元素(在树中的任何层级都会被选出来):
    //cd

    选择未知的元素
    使用星号(Wildcards,*)可以选择未知的元素。
    下面这个语法会选出/catalog/cd 的所有子元素:
    /catalog/cd/*
    以下的语法会选出所有catalog的子元素中,包含有price作为子元素的元素。
    /catalog/*/price
    以下的语法会选出有两层父节点,叫做price的所有元素。
    /*/*/price
    以下的语法会选择出文件中的所有元素。
    //*
    要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。

    选择分支
    使用中括号可以选择分支。以下的语法从catalog的子元素中取出第一个叫做cd的元素。XPath的定义中没有第0元素这种东西。
    /catalog/cd[1]
    以下语法选择catalog中的最后一个cd元素:(XPathj并没有定义 first() 这种函式喔,用上例的 [1]就可以取出第一个元素。
    /catalog/cd[last()]

  • 相关阅读:
    Docker
    Docker
    Linux
    VUE- 前端插件
    小程序中实现 input 搜索框功能
    Vue 中用delete方式进行axios请求接口,请求状态码报415(Unsupported Media Type)
    关于小程序使用map组件,标记markers时报错误(ret is not defined)
    关于element 框架中table表格选中并切换下一页之前选中数据消失的问题
    vue切换路由时报错 uncaught(in promise) Navigation Duplicated 问题
    2019-09-09 JS面试题(持续更新中)
  • 原文地址:https://www.cnblogs.com/spriteflk/p/2537027.html
Copyright © 2020-2023  润新知