`

(四) 使用XPath来定位信息

阅读更多

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

 

<configuration>
    ...
    <database>
        <username>dbuser</username>
        <password>secret</password>
    </database>
</configuration>

 

可以通过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<nodeList.getLength();i++){
				Node child = nodeList.item(i);
				System.out.println("nodename:" + child.getNodeName() + ",nodevalue:" + child.getNodeValue());
			}
			//检索一个节点使用XPathConstants.NODE类型
		    Node aNode = (Node) xPath.evaluate("gridbag/row[1]", doc, javax.xml.xpath.XPathConstants.NODE);
		    System.out.println("aNode name:" + aNode.getNodeName() + ",type:" + aNode.getNodeType() + ",value" + aNode.getNodeValue());
		    //返回值为数字类型,使用XPathConstants.NUMBER类型
		    int count = ((Number)xPath.evaluate("count(/gridbag/row)", doc, javax.xml.xpath.XPathConstants.NUMBER)).intValue();
		    System.out.println("count:" + count);
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}


	private Element getRoot(String fileName, Integer parseType) {
		try{
			//得到一个DocumentBuilderFactory实例用于生成DocumentBuilder
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			//通知文档生成工厂打开验证特性
			factory.setValidating(true);
			//当通过Schema验证时必须加入以下代码
			if(parseType == PARSE_TYPE_SAX){
				//必须打开对命名空间的支持,即使在XML文件里不使用它
				factory.setNamespaceAware(true);
				//必须通过如下代码来准备处理Schema的工厂
			    final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
			    final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
			    factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
			}
			//指定由此工厂创建的解析器在解析 XML 文档时,必须删除元素内容中的空格
			factory.setIgnoringElementContentWhitespace(true);
			//从DocumentBuilderFactory中得到DocumentBuilder对象
			DocumentBuilder builder = factory.newDocumentBuilder();
			//读入文档
			File file = new File(fileName);
			if(!file.exists()){
				return null;
			}
			Document doc = builder.parse(new File(fileName));
			
			return doc.getDocumentElement();
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
		
	}
}
 

 

 

 

分享到:
评论

相关推荐

    Selenium WebDriver中使用By.Xpath快速定位页面元素

    By.Xpath 是一种快速定位页面元素的方法,通过使用 XPath 语法来定位页面元素。 在 Selenium WebDriver 中使用 By.Xpath 快速定位页面元素可以实现多属性定位一个元素。例如,在登录页面密码框定位中,可以使用 By....

    xpath定位,xpath定位,xpath定位

    Selenium xpath,

    用xpath精确定位节点元素

    ### 使用XPath精确定位节点元素 #### XPath简介与重要性 XPath是一种用于在XML文档中查找信息的语言。它被设计用来在XML文档中导航,帮助开发者精确地定位和选取节点。XPath在XSLT(Extensible Stylesheet ...

    页面元素xpath定位工具.rar

    使用XPath定位工具,测试工程师可以更高效地进行网页测试,无需手动编写复杂的定位代码,提高了工作效率。此外,对于网页开发者来说,这样的工具也有助于调试和理解DOM结构。 在实际应用中,XPath结合Selenium ...

    Selenium_XPath定位详解

    以下是一些基本的XPath定位方法: 1. **基于标签名**:通过元素的标签名定位,如`//button`会找到所有的按钮元素。 2. **基于ID**:使用`[@id='element_id']`来定位具有特定ID的元素,例如`//input[@id='username'...

    用XPath精确定位节点元素

    通过深入学习和实践,你将能够熟练地使用XPath来精确定位XML文档中的节点元素,从而更高效地处理XML数据。在实际工作中,XPath常被用在XSLT转换、XML验证、数据提取等多个场景,是XML处理中不可或缺的一部分。因此,...

    Xpath生成器,自动生成XPATH,C#版

    XPath(XML Path Language)是一种在XML文档中查找信息的语言,它是W3C组织制定的一种标准查询语言,用于选取XML文档中的节点,包括元素、属性、文本等。在本项目“Xpath生成器,自动生成XPATH,C#版”中,开发者...

    js中使用xpath来解析xml元素实用.pdf

    XPath使用路径表达式来定位这些节点,类似于文件系统中的路径。它还包含一个标准函数库,可以进行更复杂的查询和数据处理。 在JavaScript中,XPath主要应用于AJAX开发,即在客户端与服务器交互时解析返回的XML数据...

    Chrome控制台妙用之定位xpath_js_css居家必备好工具

    本文将重点介绍Chrome控制台中的一个实用技巧——利用`$x`命令来定位和操作XPath、JavaScript以及CSS。 XPath是一种在XML文档中查找信息的语言,它可以帮助我们精确地选取HTML或XML文档中的元素。`$x`是Chrome...

    xpath-helper 插件及使用方法

    XPath(XML Path Language)是一种在XML文档中查找信息的语言,它通过路径表达式来选取节点,如元素、属性、文本等。 该插件的主要功能包括: 1. **元素定位**:在浏览网页时,XPath Helper允许用户右键点击任何...

    Java中使用xpath获取xml中的数据

    XPath使用路径表达式来选取XML文档中的节点。这些路径表达式类似于文件系统中的路径,例如`/root/element`表示从根节点开始,选取名为`element`的子节点。XPath支持多种操作,如选择所有子节点(`*`)、选取具有特定...

    火狐老版本+xpath插件(适合python+xpath爬虫使用)

    XPath是一种在XML文档中查找信息的语言,对于数据提取和解析尤其有效。在这个压缩包中,我们找到了火狐的老版本浏览器和一个专门针对XPath的插件,这对于Python开发者来说,是一个极好的工具集,可以方便地进行网页...

    xpath-helper.zip

    XPath(XML Path Language)是一种在XML文档中查找信息的语言,它允许我们通过路径表达式来选取节点,如元素、属性、文本等。XPath的使用极大地简化了数据的检索和处理过程。 在Python的Web爬虫开发中,lxml库是...

    谷歌浏览器XPath2.0插件

    XPath Helper是一款专为谷歌浏览器设计的插件,它极大地简化了网页抓取和解析过程,尤其对于使用XPath语法来定位HTML元素的用户来说,这款工具是不可或缺的助手。XPath(XML Path Language)是一种在XML文档中查找...

    XPath Helper版本2.0.2

    XPath Helper是一款非常实用的工具,尤其对于Web开发者和数据抓取者来说,它极大地简化了在网页中查找和提取信息的过程。版本2.0.2是这个插件的一个更新,旨在提供更稳定、高效的功能。XPath(XML Path Language)是...

    xpath的定位教程.doc

    XPath,全称XML Path Language,是一种在XML文档中查找信息的语言。它被广泛应用于UI自动化测试,特别是Selenium等Web自动化测试工具中,用于选择HTML DOM中的元素。XPath的使用和表达式结构与文件系统的路径类似,...

    用XPath 表达式从 XML 文档中提取信息

    XPath表达式是用于定位这些节点的语句,它们允许开发者高效地从复杂的XML数据结构中提取所需信息。 在XML文档中,每个元素、属性和文本都有一个唯一的路径,XPath就是通过这个路径来找到它们。XPath使用路径表达式...

    XPath 使用方法

    1. **路径表达式**:XPath 使用路径表达式来定位 XML 文档中的节点。路径表达式类似于文件系统的路径,例如 `/books/book/title` 表示从根节点开始找到所有 `book` 节点下的 `title` 节点。 2. **标准函数库**:...

    Xpath指南XPATH实例

    - **路径表达式**:XPath通过路径表达式来定位XML文档中的节点,如 `/` 表示根节点,`.` 表示当前节点,`..` 表示父节点。 2. **轴(Axis)**: - XPath中的轴定义了节点之间的关系,比如`child`轴表示子节点,`...

Global site tag (gtag.js) - Google Analytics