XML 与 XPATH 简介

XML

XPATH

概括说明

1.        /用于匹配绝对路径,//直接匹配所有的节点,两个匹配符可以一起使用;

2.        *用于匹配所有内容,可以在节点、属性等所有位置使用;

3.        or and用于表达逻辑关系,可以在节点、属性等所有位置使用;

4.        [ ]用于设定具体节点的定义内容,[@prop]用于定位名称为prop的属性;

5.        运算符:

a)        div除法;

b)        mod取余;

c)        +加法;

d)        减法;

6.        函数:

a)        last()标记最后一个元素;

b)        not()排除函数内的定义元素;

c)        normalize-space()去处元素值的前后空格;

d)        count()元素计数;

e)        name()元素名称;

f)         starts-with()元素值的起始数值;

g)        contains()元素值包含内容;

h)        string-length()元素值的长度;

i)          position()节点在同级别节点中的位置,计数从1开始;

j)          floor()去尾函数;

k)        ceiling()向上取整函数;

7.        节点关联定位:

a)        child::节点的子节点;

b)        descendant::节点的所有子节点,不包括本节点;

c)        parent::节点的父节点;

d)        ancestor::节点的所有父节点,包括父节点、父节点的父节点等等,一直到根节点包括根节点;

e)        following-sibling::节点的所有同级别节点,不包括本节点;

f)         preceding-sibling::本节点以前的同级别节点;

g)        following::本节点后面的同级别节点;

h)        preceding::本节点前面的同级别节点和其所有子节点;

i)          descendant-or-self::本节点与本节点所有的子节点;

j)          ancestor-or-self::本节点与所有的父节点,一直到根节点,并且包括根节点;

k)        ancestor:: descendant::following:: preceding:: self::都可以进行相关含义的定位;

一些注意问题:

//@prop和//*[@prop]的区别

//@prop查询到的结果是属性的集合,并不是包含这个属性的节点集合。若想获得包含这个属性的节点集合,需要使用//*[@prop]

XPATH查询的节点结果

查询结果的节点,若包含子节点则一样被关联出来。这就是说查询的节点结果,其实是一个指向源DOC对应节点的一个指针。

 

一些使用范例

1.        /用于表达绝对路径

/AAA

     <AAA>

          <BBB/>

          <CCC/>

          <BBB/>

          <DDD>

               <BBB/>

          </DDD>

          <CCC>

               <DDD>

                    <BBB>

                    <BBB/>

                    </BBB>

               </DDD>

          </CCC>

    </AAA>

搜索根节点

/AAA/DDD/BBB

      <AAA>

           <BBB/>

           <CCC/>

           <BBB/>

           <DDD>

              <BBB/>

           </DDD>

           <CCC>

                <DDD>

                     <BBB>

                    <BBB/>

                     </BBB>

                </DDD>

           </CCC>

      </AAA>

搜索内容一级一级的进行嵌套,上面第二行的BBB就不会被选择出来

2.        //在任何一个层级搜索满足条件的内容

//BBB

      <AAA>

          <BBB/>

           <CCC/>

           <BBB/>

           <DDD>

              <BBB/>

           </DDD>

           <CCC>

                <DDD>

                   <BBB>

                   <BBB/>

                   </BBB> 

                </DDD>

           </CCC>

      </AAA>

这样,只要名称匹配的内容都会被搜索出来

//DDD/BBB

      <AAA>

           <BBB/>

           <CCC/>

           <BBB/>

           <DDD>

              <BBB/>

           </DDD>

           <CCC>

                <DDD>

                   <BBB>

                    <BBB/>

                   </BBB> 

                </DDD>

           </CCC>

      </AAA>

/ //两种定位符可以嵌套使用

3.        *作为通配符存在

/*/*/*/BBB

      <AAA>

           <BBB/>

           <CCC/>

           <BBB/>

           <DDD>

                <BBB/>

           </DDD>

           <CCC>

                <DDD>

                   <BBB>

                    <BBB/>

                   </BBB> 

                </DDD>

           </CCC>

      </AAA>

* 可以替代当前定位位置的任何内容,并且可以多次使用

//*

     <AAA>

          <BBB/>

          <CCC/>

          <BBB/>

          <DDD>

              <BBB/>

          </DDD>

          <CCC>

              <DDD>

                   <BBB>

                   <BBB/>

                   </BBB> 

              </DDD>

          </CCC>

     </AAA>

这样相当于选择了所有的节点

4.        []进行节点的细节定义

/AAA/BBB[1]

      <AAA>

          <BBB/>

           <BBB/>

           <BBB/>

           <BBB/>

      </AAA>

括号中直接填写数字,相当于定位第几个节点,类似于数组的下标,不过起始编号从1开始

/AAA/BBB[last()]

      <AAA>

           <BBB/>

           <BBB/>

           <BBB/>

          <BBB/>

      </AAA>

last() 函数,直接指向到最后一个节点

 

//BBB[@id]

      <AAA>

           <BBB id = "b1"/> 

           <BBB name = " bbb "/>

           <BBB name = "bbb"/>

      </AAA>

选择拥有id属性的节点,上面的例子也可以写成 //BBB[@id=’b1’]一样选择这个节点

//BBB[@name=’bbb’]

      <AAA>

           <BBB id = "b1"/>

           <BBB name = " bbb "/>

           <BBB name =  "bbb"/>

      </AAA>

空格在内容匹配中是做匹配的,所以第一个BBB没有被选择,因为name的值前后有空格

//BBB[normalize-space(@name)=’bbb’]

      <AAA>

           <BBB id = "b1"/>

           <BBB name = " bbb  "/>

           <BBB name =  "bbb"/>

      </AAA>

normalize-space 函数会去处属性值前后的空格,所以选中了2BBB

//*[count(BBB)=2]

     <AAA>

           <CCC>

                <BBB/>

                <BBB/>

                <BBB/>

           </CCC>

          <DDD>

                <BBB/>

                <BBB/>

          </DDD>

           <EEE>

                <CCC/>

                <DDD/>

           </EEE>

      </AAA>

count 函数可以对元素进行计数统计,所以CCC并没有被选中

//*[count(*)=2]

     <AAA>

           <CCC>

                <BBB/>

                <BBB/>

                <BBB/>

           </CCC>

          <DDD>

                <BBB/>

                <BBB/>

          </DDD>

          <EEE>

                <CCC/>

                <DDD/>

          </EEE>

      </AAA>

* 通配符,在这里依然可以使用

//*[count(*)=3]

     <AAA>

          <CCC>

                <BBB/>

                <BBB/>

                <BBB/>

          </CCC>

           <DDD>

                <BBB/>

                <BBB/>

           </DDD>

           <EEE>

                <CCC/>

                <DDD/>

           </EEE>

     </AAA>

根节点也在选择的范围之内

 参考文献:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值