博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(四) 使用XPath来定位信息
阅读量:4047 次
发布时间:2019-05-25

本文共 3360 字,大约阅读时间需要 11 分钟。

如果要定位某个XML文档中的一段特定的信息,通过遍历DOM树的众多节点来进行查找显得有些麻烦,XPath语言使得访问树节点变得很容易。

1. 例如,有如下XML文档

 

...
dbuser
secret

 

可以通过XPath表达式 /configuration/database/username 求值来得到database中的username的值

下列操作比普通的DOM方式要简单的多:
(1).得到文档节点
(2).枚举它的子元素
(3).定位database元素
(4).获取database元素的第一个子元素,即username元素
(5).获取username元素的第一个子元素,即Text节点
(6).获取Text节点中的数据
2. XPath可以描述XML文档中的一组节点,
例如
    XPath: /gridbag/row
描述了根元素gridbag的子元素中所有的row元素,可以用 [] 操作符来选择特定元素
    /gridbag/row[1]
这表示第一行(索引号从1开始)
3. 使用 @ 操作符可以得到属性值。
    /gridbag/row[1]/cell[1]/@anchor
描述了第一行第一个单元格的anchor属性
    /gridbag/row/cell/@anchor
描述了根元素gridbag下所有子元素row下的所有子元素cell的anchor属性点
4. XPath有很多有用的函数,
例如
    count(/gridbag/row)
返回gridbag根元素下row元素的数量。
5. Java SE 5.0增加了一个API来计算XPath表达式
(1)需要先从XPathFactory创建一个XPath对象:

 

javax.xml.xpath.XPathFactory xpFactory = XPathFactory.newInstance();    javax.xml.xpath.XPath xPath = xpFactory.newXPath();
 

(2)然后调用evaluate方法来计算XPath表达式

 

String username = xPath.evaluate("/configuration/database/username", doc);

 

(3)可以用同样的XPath对象来计算多个表达式,这种形式的evaluate方法将返回一个字符串,适用于检索文本,比如之前例子中的username

例:如果XPath表达式产生了一组节点,使用XPathConstants.NODESET类型

 

NodeList nodes = (NodeList) xPath.evaluate("gridbag", doc, javax.xml.xpath.XPathConstants.NODESET);
 

例:结果只有一个节点,使用XPathConstants.NODE类型

 

NodeList nodes = (NodeList) xPath.evaluate("gridbag/row[1]", doc, javax.xml.xpath.XPathConstants.NODE);NUMBER

 

例:结果是一个数字,使用XPathConstants.NUMBER类型

int count = ((Number)xPath.evaluate("count(/gridbag/row)", doc, javax.xml.xpath.XPathConstants.NUMBER)).intValue();
 

(4)不必从文档的根节点开始搜索,可以从任意一个节点或节点列表开始。

例:如果前一次计算得到一个节点

 

xPath.evaluate(expression, node);

 

 

DEMO:

 

package xml.XPath;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.xpath.XPath;import javax.xml.xpath.XPathFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;public class MyXPathTest {		private static final Integer PARSE_TYPE_DOM = 1;	private static final Integer PARSE_TYPE_SAX = 2;		public static void main(String[] args) {		MyXPathTest xpathTest = new MyXPathTest();		String fileName = System.getProperty("user.dir") + File.separator + "conf" 				+ File.separator + "xml" + File.separator + "fontdialog.xml";		File file = new File(fileName);		xpathTest.parseXML(file, PARSE_TYPE_DOM);	}	private void parseXML(File file, Integer parseTypeDom) {		try{			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();			factory.setValidating(true);			//指定由此工厂创建的解析器在解析 XML 文档时,必须删除元素内容中的空格			factory.setIgnoringElementContentWhitespace(true);			//从DocumentBuilderFactory中得到DocumentBuilder对象			DocumentBuilder builder = factory.newDocumentBuilder();			//读入文档			Document doc = builder.parse(file);						XPathFactory xpFactory = XPathFactory.newInstance();			XPath xPath = xpFactory.newXPath();			//检索文本,即一个Text类型节点的值			String username = xPath.evaluate("/gridbag/row[1]/cell[1]/bean/property/name", doc);			System.out.println("username:" + username);			//检索一个节点的属性			String anchor = xPath.evaluate("/gridbag/row[1]/cell[1]/@anchor", doc);			System.out.println("anchor:" + anchor);			//检索一组节点,使用XPathConstants.NODESET类型			NodeList nodeList = (NodeList) xPath.evaluate("gridbag/row", doc, javax.xml.xpath.XPathConstants.NODESET);			System.out.println("nodeList......");			for(int i=0;i
 

 

 

 

转载地址:http://jayci.baihongyu.com/

你可能感兴趣的文章
01Java基础语法-18. 各种循环语句的区别和应用场景
查看>>
01Java基础语法-19. 循环跳转控制语句
查看>>
Django框架全面讲解 -- Form
查看>>
socket,accept函数解析
查看>>
今日互联网关注(写在清明节后):每天都有值得关注的大变化
查看>>
”舍得“大法:把自己的优点当缺点倒出去
查看>>
[今日关注]鼓吹“互联网泡沫,到底为了什么”
查看>>
[互联网学习]如何提高网站的GooglePR值
查看>>
[关注大学生]求职不可不知——怎样的大学生不受欢迎
查看>>
[关注大学生]读“贫困大学生的自白”
查看>>
[互联网关注]李开复教大学生回答如何学好编程
查看>>
[关注大学生]李开复给中国计算机系大学生的7点建议
查看>>
[茶余饭后]10大毕业生必听得歌曲
查看>>
gdb调试命令的三种调试方式和简单命令介绍
查看>>
C++程序员的几种境界
查看>>
VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法
查看>>
VUE-Vue.js之$refs,父组件访问、修改子组件中 的数据
查看>>
Vue-子组件改变父级组件的信息
查看>>
Python自动化之pytest常用插件
查看>>
Python自动化之pytest框架使用详解
查看>>