XML—XPATH语法介绍

互联网 17-2-24

为什么需要xpath?

xpath通常结合dom4j配合使用,而且如果要使用xpath,则需要引入一个新的包jaxen-1.1-beta-6.jar

xpath的基础语法有以下几点:

1.基本的xpath语法类似于在一个文件系统中定位文件,如果路径以斜线/开始,那么该路径就表示到一个元素的绝对路径.

(1)/AAA,它表示选择根元素AAA

<AAA>这里    <BBB/>      <CCC/>      <BBB/>      <BBB/>      <DDD>          <BBB/>      <DDD/>      <CCC/><AAA/>这里

(2)/AAA/CCC,表示选择AAA的所有CCC子元素

<AAA>      <BBB/>      <CCC/>这里    <BBB/>      <BBB/>      <DDD>          <BBB/>      <DDD/>      <CCC/>这里<AAA/>

(3)/AAA/DDD/BBB,表示选择AAA的子元素DDD的所有BBB子元素

<AAA>      <BBB/>      <CCC/>      <BBB/>      <BBB/>      <DDD>          <BBB/>这里    <DDD/>      <CCC/><AAA/>

那么怎么在dom4j中运用xpath呢?其实很简单:

//1.得到SAXReader解析器SAXReader saxReader = new SAXReader();  //2.指定去解析哪个文件Document document = saxReader.read(new File(path));  //3.可以使用xpath随心读取// document.selectNodes(args)返回多个元素  // document.selectSingleNode(args)返回单个元素List nodes = document.selectNodes("/AAA/BBB");

通过dom4j得到document对象后,可以使用document的selectNodes(args)方法,这个方法会根据你写的xpath路径返回一个List,余下的操作就和dom4j类似了。

同时它也有一个selectSingleNode(args)方法,用于返回一个单个的Node。

下面继续介绍其他的xpath语法:

2.如果路径以双斜线//开头,则表示文档中所有满足双斜线//之后规则的元素(无论层级关系)

(1)//BBB,它表示选择所有BBB元素

<AAA>      <BBB/>这里    <CCC/>      <BBB/>这里    <DDD>          <BBB/>这里    </DDD>      <CCC>          <DDD>              <BBB/>这里            <BBB/>这里        </DDD>      </CCC></AAA>

(2)//DDD/BBB,表示所有父元素是DDD的BBB元素

<AAA>      <BBB/>      <CCC/>      <BBB/>      <DDD>          <BBB/>这里    </DDD>      <CCC>          <DDD>              <BBB/>这里            <BBB/>这里        </DDD>      </CCC></AAA>

3.星号*表示选择所有由星号之前路径所定位的元素

(1)/AAA/CCC/DDD/*,它表示选择所有路径依附于/AAA/CCC/DDD的元素:

<AAA>      <XXX>          <DDD>              <BBB/>              <BBB/>              <EEE/>              <FFF/>          </DDD>      </XXX>      <CCC>          <DDD>              <BBB/>这里                          <BBB/>这里                          <EEE/>这里                          <FFF/>这里                      </DDD>      </CCC>      <CCC>          <BBB>              <BBB>                  <BBB/>              </BBB>          </BBB>      </CCC></AAA>

(2)/*/*/*/BBB,它表示所有的有3个祖先元素的BBB元素

<AAA>      <XXX>          <DDD>              <BBB/>这里                          <BBB/>这里                          <EEE/>              <FFF/>          </DDD>      </XXX>      <CCC>          <DDD>              <BBB/>这里                          <BBB/>这里                          <EEE/>              <FFF/>          </DDD>      </CCC>      <CCC>          <BBB>这里            <BBB>                  <BBB/>              </BBB>          </BBB>      </CCC></AAA>

(3)//*,它表示选择所有的元素

4.方括号里的表达式可以进一步地指定元素,其中数字表示元素在选择集里的位置,而last()函数则表示选择集中的最后一个元素。特别要注意的是这里的下标是从1开始的,而不是0! (1)/AAA/BBB[1],它表示选择AAA的第一个BBB子元素

<AAA>      <BBB/>这个    <BBB/>      <BBB/>      <BBB/></AAA>

(2)/AAA/BBB[last()],表示选择AAA的最后一个BBB元素

<AAA>      <BBB/>      <BBB/>      <BBB/>      <BBB/>这个</AAA>

5.对属性的操作

(1)//@id,选择所有的id属性,注意:是把所有的id属性当做节点返回,而不是返回有id属性的节点。

<AAA>      <BBB id="b1"/>返回这里的id属性节点    <BBB id="b2"/>也返回这里的id属性节点    <BBB name="bbb"/>      <BBB/></AAA>

(2)//BBB[@id],选择所有有id属性的BBB节点

<AAA>      <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>也返回这个BBB节点    <BBB name="bbb"/>      <BBB/></AAA>

(3)//BBB[@name],选择所有有name属性的BBB节点

<AAA>      <BBB id="b1"/>      <BBB id="b2"/>      <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>

(4)//BBB[@*],选择所有有属性的BBB节点

<AAA>      <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>返回这个BBB节点    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>

(5)//BBB[not(@*)],选择所有没有属性的BBB节点

<AAA>      <BBB id="b1"/>      <BBB id="b2"/>      <BBB name="bbb"/>      <BBB/>这个</AAA>

6.属性的值可以被用来作为选择的准则

(1)//BBB[@id='b1'],选择含有属性id且其值为’b1’的BBB元素

<AAA>      <BBB id="b1"/>这个    <BBB name="bbb"/>      <BBB name="bbb"/></AAA>

7.count()函数可以计数所选元素的个数

(1)//*[count(BBB)=2],选择含有2个BBB子元素的元素

<AAA>      <CCC>          <BBB/>          <BBB/>          <BBB/>      </CCC>      <DDD>返回这个元素        <BBB/>          <BBB/>      </DDD>      <EEE>          <CCC/>          <DDD/>      </EEE></AAA>

(2)//*[count(*)=2],选择含有2个子元素的元素

<AAA>      <CCC>          <BBB/>          <BBB/>          <BBB/>      </CCC>      <DDD>返回这个元素        <BBB/>          <BBB/>      </DDD>      <EEE>也返回这个元素        <CCC/>          <DDD/>      </EEE></AAA>

还有很多其他的语法,包括很多函数的应用,用的不多,这里不做介绍

另外,上述介绍的几点语法可以任意组合,比如下述的xml文档:

<AAA>      <BBB id="b1">          <CCC>              <KKK>k1</KKK>          </CCC>          <CCC>              <KKK>k2</KKK>这个        </CCC>      </BBB>      <BBB id="b2"/>      <BBB name="bbb"/></AAA>

假如我们现在要找AAA元素下面的第1个BBB子元素下面的第2CCC子元素的KKK子元素,则xpath路径应该这么写: /AAA/BBB[1]/CCC[2]/KKK

为什么需要xpath?

xpath通常结合dom4j配合使用,而且如果要使用xpath,则需要引入一个新的包jaxen-1.1-beta-6.jar

xpath的基础语法有以下几点:

1.基本的xpath语法类似于在一个文件系统中定位文件,如果路径以斜线/开始,那么该路径就表示到一个元素的绝对路径.

(1)/AAA,它表示选择根元素AAA

<AAA>这里    <BBB/>      <CCC/>      <BBB/>      <BBB/>      <DDD>          <BBB/>      <DDD/>      <CCC/><AAA/>这里

(2)/AAA/CCC,表示选择AAA的所有CCC子元素

<AAA>      <BBB/>      <CCC/>这里    <BBB/>      <BBB/>      <DDD>          <BBB/>      <DDD/>      <CCC/>这里<AAA/>

(3)/AAA/DDD/BBB,表示选择AAA的子元素DDD的所有BBB子元素

<AAA>      <BBB/>      <CCC/>      <BBB/>      <BBB/>      <DDD>          <BBB/>这里    <DDD/>      <CCC/><AAA/>

那么怎么在dom4j中运用xpath呢?其实很简单:

//1.得到SAXReader解析器SAXReader saxReader = new SAXReader();  //2.指定去解析哪个文件Document document = saxReader.read(new File(path));  //3.可以使用xpath随心读取  // document.selectNodes(args)返回多个元素  // document.selectSingleNode(args)返回单个元素List nodes = document.selectNodes("/AAA/BBB");

通过dom4j得到document对象后,可以使用document的selectNodes(args)方法,这个方法会根据你写的xpath路径返回一个List,余下的操作就和dom4j类似了。

同时它也有一个selectSingleNode(args)方法,用于返回一个单个的Node。

下面继续介绍其他的xpath语法:

2.如果路径以双斜线//开头,则表示文档中所有满足双斜线//之后规则的元素(无论层级关系)

(1)//BBB,它表示选择所有BBB元素

<AAA>      <BBB/>这里    <CCC/>      <BBB/>这里    <DDD>          <BBB/>这里    </DDD>      <CCC>          <DDD>              <BBB/>这里            <BBB/>这里        </DDD>      </CCC></AAA>

(2)//DDD/BBB,表示所有父元素是DDD的BBB元素

<AAA>      <BBB/>      <CCC/>      <BBB/>      <DDD>          <BBB/>这里    </DDD>      <CCC>          <DDD>              <BBB/>这里            <BBB/>这里        </DDD>      </CCC></AAA>

3.星号*表示选择所有由星号之前路径所定位的元素

(1)/AAA/CCC/DDD/*,它表示选择所有路径依附于/AAA/CCC/DDD的元素:

<AAA>      <XXX>          <DDD>              <BBB/>              <BBB/>              <EEE/>              <FFF/>          </DDD>      </XXX>      <CCC>          <DDD>              <BBB/>这里                          <BBB/>这里                          <EEE/>这里                          <FFF/>这里                      </DDD>      </CCC>      <CCC>          <BBB>              <BBB>                  <BBB/>              </BBB>          </BBB>      </CCC></AAA>

(2)/*/*/*/BBB,它表示所有的有3个祖先元素的BBB元素

<AAA>      <XXX>          <DDD>              <BBB/>这里                          <BBB/>这里                          <EEE/>              <FFF/>          </DDD>      </XXX>      <CCC>          <DDD>              <BBB/>这里                          <BBB/>这里                          <EEE/>              <FFF/>          </DDD>      </CCC>      <CCC>          <BBB>这里                      <BBB>                  <BBB/>              </BBB>          </BBB>      </CCC></AAA>

(3)//*,它表示选择所有的元素

4.方括号里的表达式可以进一步地指定元素,其中数字表示元素在选择集里的位置,而last()函数则表示选择集中的最后一个元素。特别要注意的是这里的下标是从1开始的,而不是0! (1)/AAA/BBB[1],它表示选择AAA的第一个BBB子元素

<AAA>      <BBB/>这个    <BBB/>      <BBB/>      <BBB/></AAA>

(2)/AAA/BBB[last()],表示选择AAA的最后一个BBB元素

<AAA>      <BBB/>      <BBB/>      <BBB/>      <BBB/>这个</AAA>

5.对属性的操作

(1)//@id,选择所有的id属性,注意:是把所有的id属性当做节点返回,而不是返回有id属性的节点。

<AAA>      <BBB id="b1"/>返回这里的id属性节点    <BBB id="b2"/>也返回这里的id属性节点    <BBB name="bbb"/>      <BBB/></AAA>

(2)//BBB[@id],选择所有有id属性的BBB节点

<AAA>      <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>也返回这个BBB节点    <BBB name="bbb"/>      <BBB/></AAA>

(3)//BBB[@name],选择所有有name属性的BBB节点

<AAA>      <BBB id="b1"/>      <BBB id="b2"/>      <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>

(4)//BBB[@*],选择所有有属性的BBB节点

<AAA>      <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>返回这个BBB节点    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>

(5)//BBB[not(@*)],选择所有没有属性的BBB节点

<AAA>      <BBB id="b1"/>      <BBB id="b2"/>      <BBB name="bbb"/>      <BBB/>这个</AAA>

6.属性的值可以被用来作为选择的准则

(1)//BBB[@id='b1'],选择含有属性id且其值为’b1’的BBB元素

<AAA>      <BBB id="b1"/>这个    <BBB name="bbb"/>      <BBB name="bbb"/></AAA>

7.count()函数可以计数所选元素的个数

(1)//*[count(BBB)=2],选择含有2个BBB子元素的元素

<AAA>      <CCC>          <BBB/>          <BBB/>          <BBB/>      </CCC>      <DDD>返回这个元素        <BBB/>          <BBB/>      </DDD>      <EEE>          <CCC/>          <DDD/>      </EEE></AAA>

(2)//*[count(*)=2],选择含有2个子元素的元素

<AAA>      <CCC>          <BBB/>          <BBB/>          <BBB/>      </CCC>      <DDD>返回这个元素        <BBB/>          <BBB/>      </DDD>      <EEE>也返回这个元素        <CCC/>          <DDD/>      </EEE></AAA>

还有很多其他的语法,包括很多函数的应用,用的不多,这里不做介绍

另外,上述介绍的几点语法可以任意组合,比如下述的xml文档:

<AAA>      <BBB id="b1">          <CCC>              <KKK>k1</KKK>          </CCC>          <CCC>              <KKK>k2</KKK>这个        </CCC>      </BBB>      <BBB id="b2"/>      <BBB name="bbb"/></AAA>

假如我们现在要找AAA元素下面的第1个BBB子元素下面的第2CCC子元素的KKK子元素,则xpath路径应该这么写: /AAA/BBB[1]/CCC[2]/KKK

以上就是XML——XPATH语法介绍 的内容,更多相关内容请关注PHP中文网(www.php.cn)!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: XML,XPATH
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:XML—XML解析之DOM4J

相关资讯