大家经常运用DOM4J操作XML文档,如果XML文档存在namespace的话,读写XML经常不工作。下面是一个简单的例子,例子中需要用到的两个xml文件:a.xml与book.xml见附件。代码如下:
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
public class XpathTest {
/**
* 已知命名空间,获得该命名空间下节点
* @throws Exception
*/
public static void test1() throws Exception {
SAXReader reader = new SAXReader();
String uri = "http://WebXml.com.cn/";//命名空间
HashMap map = new HashMap();//将uri存入map中
map.put("xx", uri);
reader.getDocumentFactory().setXPathNamespaceURIs(map);
InputStream is = new FileInputStream("src/a.xml");
org.dom4j.Document document = reader.read(is);
org.dom4j.XPath xpath = DocumentHelper.createXPath("//xx:string");
List list = xpath.selectNodes(document);//等价List list = document.selectNodes("//xx:string");
for(int i=0; i<list.size(); i++){
Node node = (Node)list.get(i);//转型为Node
System.out.println("hah====="+node.getText());
Element e = (Element)list.get(i);//转型为Element
System.out.println(e.getText());
}
}
/**
* 先通过document获得命名空间,再获得该命名空间下节点
* @throws Exception
*/
public static void test2() throws Exception {
SAXReader reader = new SAXReader();
InputStream is = new FileInputStream("src/a.xml");
org.dom4j.Document document = reader.read(is);
//获得节点的命名空间
String uri = document.getRootElement().element("Body")
.element("getWeatherbyCityNameResponse").getNamespaceURI();
//将uri存入map中
HashMap map = new HashMap();
map.put("xx", uri);
org.dom4j.XPath xpath = DocumentHelper.createXPath("//xx:string");
xpath.setNamespaceURIs(map);
List list = xpath.selectNodes(document);
for(int i=0; i<list.size(); i++){
Node node = (Node)list.get(i);//转型为Node
System.out.println("hah====="+node.getText());
Element e = (Element)list.get(i);//转型为Element
System.out.println(e.getText());
}
}
/**
* 运用jdk中自带包javax.xml.xpath包
* @throws Exception
*/
public static void test3() throws Exception {
//将XML文档加载到DOM Document对象中
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = factory.newDocumentBuilder();
org.w3c.dom.Document doc = builder.parse("src/books.xml");
//创建 XPathFactory
XPathFactory pathFactory = XPathFactory.newInstance();
//使用XPathFactory工厂创建 XPath 对象
XPath xpath = pathFactory.newXPath();
//使用XPath对象编译XPath表达式
XPathExpression pathExpression = xpath
.compile("//book[author='TEST']/title/text()");
//计算 XPath 表达式得到结果
Object result = pathExpression.evaluate(doc, XPathConstants.NODESET);
//节点集node-set转化为NodeList
//将结果强制转化成 DOM NodeList
org.w3c.dom.NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
}
//查找所有图书的 XPath 查询非常简单:
//book[author="TEST"]
//book代表节点的名称,author属性的名称,后面是要查询的值
//为了找出这些图书的标题(title),只要增加一步,表达式就变成了:
//book[author="TEST"]/title
//title代表要取元素的名称
//最后,真正需要的是 title 元素的文本节点内容.这就要求再增加一步,完整的表达式就是:
//book[author="TEST"]/title/text()
//text()该节点的内容
}
public static void main(String[] args) throws Exception{
test1();
//test2();
//test3();
}
}
以下是几个XPath讲解的资料:
dom4j中XPath的使用:
http://nieli.iteye.com/blog/540720
xpath的数据和节点类型以及XPath中节点匹配的基本方法:
http://www.iteye.com/topic/258109
编写简单的XPath程序:
http://www.iteye.com/topic/153252
分享到:
相关推荐
**DOM4J中XPath的使用** XPath是一种在XML文档中查找信息的语言,它被设计用来在XML文档中导航,寻找节点、属性或者信息。DOM4J是Java中一个非常流行的XML处理库,它提供了对XPath的强大支持。这篇文档将深入探讨...
DOM4J和XPath是XML处理领域中的两个重要概念,它们在Java编程中有着广泛的应用。DOM4J是一款灵活且功能强大的Java库,主要用于处理XML文档,而XPath是一种在XML文档中查找信息的语言。 DOM4J简介: DOM4J是基于Java...
要使用DOM4J和XPath,首先需要在项目中引入相应的jar包。提供的压缩包中包含的"dom4j"文件,很可能就是DOM4J库的jar包。通常,还需要一个支持XPath的jar包,如jaxen,它为DOM4J提供了XPath的支持。如果你的描述中...
示例代码展示如何使用DOM4J执行XPath查询: ```java List<Element> elements = root.selectNodes("//book/title"); String title = (String) root.selectSingleNode("//book/title").getText(); ``` 这里使用了`...
DOM4J库集成了XPath支持,使得在DOM4J中使用XPath查询XML数据变得非常方便。 DOM4J的主要特性包括: 1. **XML解析**:DOM4J提供了多种解析方式,包括DOM、SAX和StAX,以适应不同的性能和内存需求。 2. **文档模型**...
DOM4J、XPath和JUnit是Java开发中不可或缺的三个重要工具。DOM4J是处理XML文档的一个强大库,XPath则是XML路径语言,用于在XML文档中查找信息,而JUnit则是Java编程语言中的一个单元测试框架。接下来,我们将深入...
3. **XPath支持**:DOM4J内置了XPath支持,可以方便地通过XPath表达式选取XML文档中的任意节点。 4. **文档操作**:DOM4J提供了丰富的API来操作XML文档,包括元素、属性、文本、注释、处理指令等。 5. **命名空间...
在Dom4j中,我们可以使用`org.dom4j.XPath`类来创建XPath对象,并通过`selectNodes()`或`selectSingleNode()`方法来执行路径表达式,获取XML文档中的节点集合或单个节点。以下是一个简单的示例: ```java import ...
DOM4J和XPath是Java开发中处理XML文档的两个重要工具。在本文中,我们将深入探讨它们的基本概念、功能以及如何在实际项目中运用。 **DOM4J简介** DOM4J是一个非常灵活且功能强大的Java XML API,它提供了丰富的接口...
在Java编程中,解析XML文档通常需要借助库,如DOM4J和XPath。DOM4J是一个灵活且功能强大的开源Java XML API,它提供了XML的读取、写入、修改和遍历等功能。XPath则是W3C标准中的一个查询语言,用于在XML文档中查找...
`dom4j API .chw`和`.chm`文件是DOM4J的API帮助文档,提供详细的类和方法说明,开发者可以通过这些文档了解DOM4J的具体使用方法。 XPath是XML路径语言,它提供了一种在XML文档中查找信息的标准方式。XPath通过...
16. `org.dom4j.XPath`: 提供XPath表达式的解析和评估,用于快速定位XML文档中的节点。 二、读取和解析XML文档 dom4j提供了两种主要的XML解析方式:DOMReader和SAXReader。DOMReader基于W3C DOM,将整个XML文档...
Dom4j提供了一个易于使用的API,用于构建、修改和解析XML文档,而XPath则为在文档中高效地定位和选取节点提供了简洁的语言。两者结合使用,可以极大地提高XML处理的效率和灵活性。在实际开发中,了解并熟练运用这...
本教程将重点介绍如何使用Java中的Dom4J库,结合XPath来高效地操作XML。 首先,让我们了解Dom4J库。Dom4J是Java社区中一个非常流行的处理XML的开源库,它提供了灵活且高效的API,支持XML的读取、写入、修改等多种...
Jaxen使XPath查询在不同的XML解析器之间具有可移植性,因此即使在DOM4J中使用XPath,也可以通过Jaxen调用其他解析器的实现。 "W3CSchool.chm"文档是一个经典的在线编程学习资源,其中的XPath教程可能包含了XPath的...
在本示例中,"sendXmlPersist"可能是演示程序的主类或测试用例,它展示了如何使用DOM4j和Maven配合工作。具体步骤可能包括以下几步: 1. **引入DOM4j依赖**:在`pom.xml`文件中,添加DOM4j的依赖项,这样Maven会在...
#### 三、DOM4j基本使用方法 1. **读取并解析XML文档** 要读取并解析XML文档,可以使用`org.dom4j.io`包中的`SAXReader`类。`SAXReader`是一个轻量级的解析器,适用于大型文档,因为它不会一次性将整个文档加载到...
在Dom4j中,使用`XPath`类进行查询。 1. **创建XPath对象**:首先,需要创建一个`XPath`对象,通常通过`DocumentHelper.createXPath()`方法实现。 ```java XPath xpath = DocumentHelper.createXPath("//element[@...
DOM4J的使用方法非常直观。例如,你可以使用以下代码创建一个新的XML文档: ```java DocumentFactory factory = DocumentFactory.getInstance(); Document document = factory.createDocument(); Element root...