欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用dom4j和XPath解析XML

程序员文章站 2022-05-28 21:08:41
...

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());
}