使用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());
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值