使用dom4j和XPath解析XML
Posted 名字真的很急用
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用dom4j和XPath解析XML相关的知识,希望对你有一定的参考价值。
1.XML解析的方式介绍
在日常的开发中常见的XML解析方式有如下二种
- DOM:要求解析器将整个XML文件全部加载到内存中,生成一个Document对象
优点:元素和元素之间保留结构,关系,可以针对元素进行增删改查操作
缺点:如果XML文件过大,可能会导致内存溢出。 - SAX:是一种速度更快,更加高效的解析方式,它是逐行扫描,边扫描边解析,并且以事件驱动的方式来进行具体的解析,每解析一行都会触发一个事件。
优点:不会出现内存溢出的问题,可以处理大文件
缺点:只能读,不能写、
解析器就是根据不同的解析方式提供具体的实现,为了方便开发人员来解析XML,有一些方便操作的类库。
dom4j:比较简单的xml解析的类库。
Jsoup:功能强大的DOM方式解析的类库,尤其对html的解析更加方便。
2.使用dom4j解析XML
java项目集成dom4j。
导入所需的jar包。
使用dom4j解析xml
- 创建解析器的对象。
SAXReader saxReader = new SAXReader();
- 使用解析器对象读取XML文档生成Document对象。
Document document=saxReader.read(一般利用反射获取xml文件路径的URL)
- 根据Document对象获取XML的元素(标签)信息。
获取根元素
Element rootElement = document.getRootElement();
Dom4j重要的api说明:
rootElement.getName():获取根标签的名称。
Element[] getRootElements():返回定义的所有根元素。
Elements():获取所有的元素。
获取所有的子元素 Element
elements():
elements(Stirng e): e指定的标签名,获取所有的指定标签名
获取指定的单个字
element(String s): s为指定的标签名,获取指定的第一个标签
Elements("标签名") :获取指定的所有标签
获取属性值 Attribute
getVaule:获取元素值
getText() : Element的元素内容
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class dom4j_xml_user {
public static void main(String[] args) throws DocumentException {
//创建解析对象
SAXReader saxReader = new SAXReader();
//获取文件的连接
String path=dom4j_xml_user.class.getClassLoader().getResource("user.xml").getPath();
System.out.println(path);
Document document = saxReader.read(dom4j_xml_user.class.getClassLoader().getResource("user.xml").getPath());
Element rootElement = document.getRootElement();
System.out.println("获取根节点的名字"+rootElement.getName());
System.out.println("获取根节点下的所有子节点列表,返回list集合");
List<Element> elements = rootElement.elements();
for(Element sonelement: elements){
System.out.println("子标签的名称"+sonelement.getName());
System.out.println("子标签的id属性值"+sonelement.attributeValue("id"));
System.out.println("子标签的country属性值"+sonelement.attributeValue("country"));
System.out.println("获取user下的子标签");
List<Element> elem = sonelement.elements();
for(Element s:elem){
System.out.println("user下子标签的名称"+s.getName());
System.out.println("获取标签下的文本"+s.getText());
}
}
//获取指定标签
//获取子标签下的第一个user标签
Element user = rootElement.element("user");
//指定子标签的文本内容
String password = user.elementText("password");
System.out.println(password);
}
}
3.dom4j结合XPath解析xml
XPath可以使用路径表达式来选取XML文档中的元素或者属性节点,节点是沿着路径来选取的。
XPath的官方文档地址:
http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html
使用需要导入所需要的jar包。
- dom4j提供XPath的API。
Node selectSingleNode(String xpathExpression);根据XPath表达式获取单个标签(元素/节点)。
List< Node > selectNodes(String xpathExpression);根据XPath表达式获取多个标签(元素/节点)。
- XPath的语法
绝对路径方式,以/开头的路径表示绝对路径,绝对路径是从根元素开始写的。例如/元素/子元素/子子元素…
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(dom4j_xml_user.class.getClassLoader().getResource("user.xml").getPath());
//获取第一个用户的密码
//强制类型转换,把NODE转换为Element
Element element = (Element)document.selectSingleNode("/users/user/password");
String password = element.getText();
System.out.println(password);
- 相对路径的方式:
相对于当前节点的元素继续查找的节点,不以/开头,…/表示上一个元素,./表示当前元素
System.out.println("使用相对路径获取查找元素");
Element element2 = (Element)document.selectSingleNode("../salary");
System.out.println("第一个用户的薪水区间"+element2.getText());
- 全文搜索路径方式:例如//子元素,//子元素//子子元素,//子元素/子子元素
//表示无论中间有多少层,直接获取所有子元素所有满足条件的元素。
/表示只找一层。
System.out.println("使用全文搜索获取查找元素");
List< Node > nodes= document.selectNodes("//id");
for(Node node: nodes){
Element idElement=(Element) node;
System.out.println("idElement.getText()");
}
- 谓语条件筛选方式,例如//元素[@attr1=‘value’]
System.out.println("条件筛选方式查找");
System.out.println("查找user id属性为TB1002的用户信息");
Element tb1002element= (Element)document.selectSingleNode("//user[@id='TB1002']");
List< Element > elementlist =tb1002element.elements();
for(Element userelement :elementlist){
System.out.println("user的子标签的名称"+userelement.getName());
System.out.println("user子标签的文本内容"+userlement.getText());
}
以上是关于使用dom4j和XPath解析XML的主要内容,如果未能解决你的问题,请参考以下文章
Dom4J配合XPath解析schema约束的xml配置文件问题