XML—XPATH语法介绍
时间:2022-02-24 10:28
为什么需要xpath? 在使用dom4j的时候,我们不能跨层获取某一个元素,必须一层一层去获取,这就非常麻烦。 xpath通常结合dom4j配合使用,而且如果要使用xpath,则需要引入一个新的包jaxen-1.1-beta-6.jar xpath的基础语法有以下几点: 1.基本的xpath语法类似于在一个文件系统中定位文件,如果路径以斜线 (1) (2) (3) 那么怎么在dom4j中运用xpath呢?其实很简单: 通过dom4j得到document对象后,可以使用document的 同时它也有一个 下面继续介绍其他的xpath语法: 2.如果路径以双斜线 (1) (2) 3.星号 (1) (2) (3) 4.方括号里的表达式可以进一步地指定元素,其中数字表示元素在选择集里的位置,而last()函数则表示选择集中的最后一个元素。特别要注意的是这里的下标是从1开始的,而不是0! (2) 5.对属性的操作 (1) (2) (3) (4) (5) 6.属性的值可以被用来作为选择的准则 (1) 7. (1) (2) 还有很多其他的语法,包括很多函数的应用,用的不多,这里不做介绍 另外,上述介绍的几点语法可以任意组合,比如下述的xml文档: 假如我们现在要找AAA元素下面的第1个BBB子元素下面的第2CCC子元素的KKK子元素,则xpath路径应该这么写: 为什么需要xpath? 在使用dom4j的时候,我们不能跨层获取某一个元素,必须一层一层去获取,这就非常麻烦。 xpath通常结合dom4j配合使用,而且如果要使用xpath,则需要引入一个新的包jaxen-1.1-beta-6.jar xpath的基础语法有以下几点: 1.基本的xpath语法类似于在一个文件系统中定位文件,如果路径以斜线 (1) (2) (3) 那么怎么在dom4j中运用xpath呢?其实很简单: 通过dom4j得到document对象后,可以使用document的 同时它也有一个 下面继续介绍其他的xpath语法: 2.如果路径以双斜线 (1) (2) 3.星号 (1) (2) (3) 4.方括号里的表达式可以进一步地指定元素,其中数字表示元素在选择集里的位置,而last()函数则表示选择集中的最后一个元素。特别要注意的是这里的下标是从1开始的,而不是0! (2) 5.对属性的操作 (1) (2) (3) (4) (5) 6.属性的值可以被用来作为选择的准则 (1) 7. (1) (2) 还有很多其他的语法,包括很多函数的应用,用的不多,这里不做介绍 另外,上述介绍的几点语法可以任意组合,比如下述的xml文档: 假如我们现在要找AAA元素下面的第1个BBB子元素下面的第2CCC子元素的KKK子元素,则xpath路径应该这么写: 以上就是XML——XPATH语法介绍 的内容,更多相关内容请关注PHP中文网(www.gxlsystem.com)!
所以为了我们更方便地访问某个节点,我们可以使用xpath技术,它可以让我们非常方便地读取到指定节点。/
开始,那么该路径就表示到一个元素的绝对路径./AAA
,它表示选择根元素AAA<AAA>这里 <BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
<DDD/>
<CCC/><AAA/>这里
/AAA/CCC
,表示选择AAA的所有CCC子元素<AAA>
<BBB/>
<CCC/>这里 <BBB/>
<BBB/>
<DDD>
<BBB/>
<DDD/>
<CCC/>这里<AAA/>
/AAA/DDD/BBB
,表示选择AAA的子元素DDD的所有BBB子元素<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>这里 <DDD/>
<CCC/><AAA/>
//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");
selectNodes(args)
方法,这个方法会根据你写的xpath路径返回一个List
,余下的操作就和dom4j类似了。selectSingleNode(args)
方法,用于返回一个单个的Node。//
开头,则表示文档中所有满足双斜线//
之后规则的元素(无论层级关系)//BBB
,它表示选择所有BBB元素<AAA>
<BBB/>这里 <CCC/>
<BBB/>这里 <DDD>
<BBB/>这里 </DDD>
<CCC>
<DDD>
<BBB/>这里 <BBB/>这里 </DDD>
</CCC></AAA>
//DDD/BBB
,表示所有父元素是DDD的BBB元素<AAA>
<BBB/>
<CCC/>
<BBB/>
<DDD>
<BBB/>这里 </DDD>
<CCC>
<DDD>
<BBB/>这里 <BBB/>这里 </DDD>
</CCC></AAA>
*
表示选择所有由星号之前路径所定位的元素/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>
/*/*/*/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>
//*
,它表示选择所有的元素
(1)/AAA/BBB[1]
,它表示选择AAA的第一个BBB子元素<AAA>
<BBB/>这个 <BBB/>
<BBB/>
<BBB/></AAA>
/AAA/BBB[last()]
,表示选择AAA的最后一个BBB元素<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>这个</AAA>
//@id
,选择所有的id属性,注意:是把所有的id属性当做节点返回,而不是返回有id属性的节点。<AAA>
<BBB id="b1"/>返回这里的id属性节点 <BBB id="b2"/>也返回这里的id属性节点 <BBB name="bbb"/>
<BBB/></AAA>
//BBB[@id]
,选择所有有id属性的BBB节点<AAA>
<BBB id="b1"/>返回这个BBB节点 <BBB id="b2"/>也返回这个BBB节点 <BBB name="bbb"/>
<BBB/></AAA>
//BBB[@name]
,选择所有有name属性的BBB节点<AAA>
<BBB id="b1"/>
<BBB id="b2"/>
<BBB name="bbb"/>返回这个BBB节点 <BBB/></AAA>
//BBB[@*]
,选择所有有属性的BBB节点<AAA>
<BBB id="b1"/>返回这个BBB节点 <BBB id="b2"/>返回这个BBB节点 <BBB name="bbb"/>返回这个BBB节点 <BBB/></AAA>
//BBB[not(@*)]
,选择所有没有属性的BBB节点<AAA>
<BBB id="b1"/>
<BBB id="b2"/>
<BBB name="bbb"/>
<BBB/>这个</AAA>
//BBB[@id='b1']
,选择含有属性id且其值为’b1’的BBB元素<AAA>
<BBB id="b1"/>这个 <BBB name="bbb"/>
<BBB name="bbb"/></AAA>
count()
函数可以计数所选元素的个数//*[count(BBB)=2]
,选择含有2个BBB子元素的元素<AAA>
<CCC>
<BBB/>
<BBB/>
<BBB/>
</CCC>
<DDD>返回这个元素 <BBB/>
<BBB/>
</DDD>
<EEE>
<CCC/>
<DDD/>
</EEE></AAA>
//*[count(*)=2]
,选择含有2个子元素的元素<AAA>
<CCC>
<BBB/>
<BBB/>
<BBB/>
</CCC>
<DDD>返回这个元素 <BBB/>
<BBB/>
</DDD>
<EEE>也返回这个元素 <CCC/>
<DDD/>
</EEE></AAA>
<AAA>
<BBB id="b1">
<CCC>
<KKK>k1</KKK>
</CCC>
<CCC>
<KKK>k2</KKK>这个 </CCC>
</BBB>
<BBB id="b2"/>
<BBB name="bbb"/></AAA>
/AAA/BBB[1]/CCC[2]/KKK
所以为了我们更方便地访问某个节点,我们可以使用xpath技术,它可以让我们非常方便地读取到指定节点。/
开始,那么该路径就表示到一个元素的绝对路径./AAA
,它表示选择根元素AAA<AAA>这里 <BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
<DDD/>
<CCC/><AAA/>这里
/AAA/CCC
,表示选择AAA的所有CCC子元素<AAA>
<BBB/>
<CCC/>这里 <BBB/>
<BBB/>
<DDD>
<BBB/>
<DDD/>
<CCC/>这里<AAA/>
/AAA/DDD/BBB
,表示选择AAA的子元素DDD的所有BBB子元素<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>这里 <DDD/>
<CCC/><AAA/>
//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");
selectNodes(args)
方法,这个方法会根据你写的xpath路径返回一个List
,余下的操作就和dom4j类似了。selectSingleNode(args)
方法,用于返回一个单个的Node。//
开头,则表示文档中所有满足双斜线//
之后规则的元素(无论层级关系)//BBB
,它表示选择所有BBB元素<AAA>
<BBB/>这里 <CCC/>
<BBB/>这里 <DDD>
<BBB/>这里 </DDD>
<CCC>
<DDD>
<BBB/>这里 <BBB/>这里 </DDD>
</CCC></AAA>
//DDD/BBB
,表示所有父元素是DDD的BBB元素<AAA>
<BBB/>
<CCC/>
<BBB/>
<DDD>
<BBB/>这里 </DDD>
<CCC>
<DDD>
<BBB/>这里 <BBB/>这里 </DDD>
</CCC></AAA>
*
表示选择所有由星号之前路径所定位的元素/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>
/*/*/*/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>
//*
,它表示选择所有的元素
(1)/AAA/BBB[1]
,它表示选择AAA的第一个BBB子元素<AAA>
<BBB/>这个 <BBB/>
<BBB/>
<BBB/></AAA>
/AAA/BBB[last()]
,表示选择AAA的最后一个BBB元素<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>这个</AAA>
//@id
,选择所有的id属性,注意:是把所有的id属性当做节点返回,而不是返回有id属性的节点。<AAA>
<BBB id="b1"/>返回这里的id属性节点 <BBB id="b2"/>也返回这里的id属性节点 <BBB name="bbb"/>
<BBB/></AAA>
//BBB[@id]
,选择所有有id属性的BBB节点<AAA>
<BBB id="b1"/>返回这个BBB节点 <BBB id="b2"/>也返回这个BBB节点 <BBB name="bbb"/>
<BBB/></AAA>
//BBB[@name]
,选择所有有name属性的BBB节点<AAA>
<BBB id="b1"/>
<BBB id="b2"/>
<BBB name="bbb"/>返回这个BBB节点 <BBB/></AAA>
//BBB[@*]
,选择所有有属性的BBB节点<AAA>
<BBB id="b1"/>返回这个BBB节点 <BBB id="b2"/>返回这个BBB节点 <BBB name="bbb"/>返回这个BBB节点 <BBB/></AAA>
//BBB[not(@*)]
,选择所有没有属性的BBB节点<AAA>
<BBB id="b1"/>
<BBB id="b2"/>
<BBB name="bbb"/>
<BBB/>这个</AAA>
//BBB[@id='b1']
,选择含有属性id且其值为’b1’的BBB元素<AAA>
<BBB id="b1"/>这个 <BBB name="bbb"/>
<BBB name="bbb"/></AAA>
count()
函数可以计数所选元素的个数//*[count(BBB)=2]
,选择含有2个BBB子元素的元素<AAA>
<CCC>
<BBB/>
<BBB/>
<BBB/>
</CCC>
<DDD>返回这个元素 <BBB/>
<BBB/>
</DDD>
<EEE>
<CCC/>
<DDD/>
</EEE></AAA>
//*[count(*)=2]
,选择含有2个子元素的元素<AAA>
<CCC>
<BBB/>
<BBB/>
<BBB/>
</CCC>
<DDD>返回这个元素 <BBB/>
<BBB/>
</DDD>
<EEE>也返回这个元素 <CCC/>
<DDD/>
</EEE></AAA>
<AAA>
<BBB id="b1">
<CCC>
<KKK>k1</KKK>
</CCC>
<CCC>
<KKK>k2</KKK>这个 </CCC>
</BBB>
<BBB id="b2"/>
<BBB name="bbb"/></AAA>
/AAA/BBB[1]/CCC[2]/KKK