使用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的主要内容,如果未能解决你的问题,请参考以下文章

dom和xpath解析xml

如何使用DOM4j+xpath 解析

Dom4J配合XPath解析schema约束的xml配置文件问题

XPath对XML文档的解析

Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

Java xml 操作(Dom4J修改xml   + xPath技术  + SAX解析 + XML约束)