如果要定位某个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;
}
}
}
分享到:
相关推荐
By.Xpath 是一种快速定位页面元素的方法,通过使用 XPath 语法来定位页面元素。 在 Selenium WebDriver 中使用 By.Xpath 快速定位页面元素可以实现多属性定位一个元素。例如,在登录页面密码框定位中,可以使用 By....
Selenium xpath,
### 使用XPath精确定位节点元素 #### XPath简介与重要性 XPath是一种用于在XML文档中查找信息的语言。它被设计用来在XML文档中导航,帮助开发者精确地定位和选取节点。XPath在XSLT(Extensible Stylesheet ...
使用XPath定位工具,测试工程师可以更高效地进行网页测试,无需手动编写复杂的定位代码,提高了工作效率。此外,对于网页开发者来说,这样的工具也有助于调试和理解DOM结构。 在实际应用中,XPath结合Selenium ...
以下是一些基本的XPath定位方法: 1. **基于标签名**:通过元素的标签名定位,如`//button`会找到所有的按钮元素。 2. **基于ID**:使用`[@id='element_id']`来定位具有特定ID的元素,例如`//input[@id='username'...
通过深入学习和实践,你将能够熟练地使用XPath来精确定位XML文档中的节点元素,从而更高效地处理XML数据。在实际工作中,XPath常被用在XSLT转换、XML验证、数据提取等多个场景,是XML处理中不可或缺的一部分。因此,...
XPath(XML Path Language)是一种在XML文档中查找信息的语言,它通过路径表达式来选取节点,如元素、属性、文本等。 该插件的主要功能包括: 1. **元素定位**:在浏览网页时,XPath Helper允许用户右键点击任何...
XPath(XML Path Language)是一种在XML文档中查找信息的语言,它是W3C组织制定的一种标准查询语言,用于选取XML文档中的节点,包括元素、属性、文本等。在本项目“Xpath生成器,自动生成XPATH,C#版”中,开发者...
XPath Helper是一款非常实用的工具,尤其对于Web开发者和数据抓取者来说,它极大地简化了在网页中查找和提取信息的过程。版本2.0.2是这个插件的一个更新,旨在提供更稳定、高效的功能。XPath(XML Path Language)是...
本文将重点介绍Chrome控制台中的一个实用技巧——利用`$x`命令来定位和操作XPath、JavaScript以及CSS。 XPath是一种在XML文档中查找信息的语言,它可以帮助我们精确地选取HTML或XML文档中的元素。`$x`是Chrome...
XPath使用路径表达式来定位这些节点,类似于文件系统中的路径。它还包含一个标准函数库,可以进行更复杂的查询和数据处理。 在JavaScript中,XPath主要应用于AJAX开发,即在客户端与服务器交互时解析返回的XML数据...
XPath使用路径表达式来选取XML文档中的节点。这些路径表达式类似于文件系统中的路径,例如`/root/element`表示从根节点开始,选取名为`element`的子节点。XPath支持多种操作,如选择所有子节点(`*`)、选取具有特定...
XPath是一种在XML文档中查找信息的语言,对于数据提取和解析尤其有效。在这个压缩包中,我们找到了火狐的老版本浏览器和一个专门针对XPath的插件,这对于Python开发者来说,是一个极好的工具集,可以方便地进行网页...
XPath(XML Path Language)是一种在XML文档中查找信息的语言,它允许我们通过路径表达式来选取节点,如元素、属性、文本等。XPath的使用极大地简化了数据的检索和处理过程。 在Python的Web爬虫开发中,lxml库是...
XPath Helper是一款专为谷歌浏览器设计的插件,它极大地简化了网页抓取和解析过程,尤其对于使用XPath语法来定位HTML元素的用户来说,这款工具是不可或缺的助手。XPath(XML Path Language)是一种在XML文档中查找...
XPath,全称XML Path Language,是一种在XML文档中查找信息的语言。它被广泛应用于UI自动化测试,特别是Selenium等Web自动化测试工具中,用于选择HTML DOM中的元素。XPath的使用和表达式结构与文件系统的路径类似,...
XPath表达式是用于定位这些节点的语句,它们允许开发者高效地从复杂的XML数据结构中提取所需信息。 在XML文档中,每个元素、属性和文本都有一个唯一的路径,XPath就是通过这个路径来找到它们。XPath使用路径表达式...
1. **路径表达式**:XPath 使用路径表达式来定位 XML 文档中的节点。路径表达式类似于文件系统的路径,例如 `/books/book/title` 表示从根节点开始找到所有 `book` 节点下的 `title` 节点。 2. **标准函数库**:...
XPath(XML Path Language)是一种在XML文档中查找信息的语言,它能够定位XML或HTML文档中的节点,如元素、属性、文本等。 XPath在Web开发中起着至关重要的作用,尤其是在进行自动化测试、数据提取和网页抓取时。...