JavaWeb之XML文档解析及XPth语言

优质文章推荐,适合零基础小白XML入门(从是什么到怎么用)

DOM文档对象模型

  • DOM(Document Object Model)定义了访问和操作XML文档的标准方法,DOM把XML文档作为树结构来查看,能够通过DOM树来读写所有元素.
    举个栗子,就像这样
    在这里插入图片描述

Dom4j

  • Dom4j是一个易用的、开源的库,用于解析XML。它
    应用于Java平台,具有性能优异、功能强大和极其易使
    用的特点。
  • Dom4j将XML视为Document对象。
  • XML标签被Dom4j定义为Element对象。

Dom4j官网下载链接 404
这个链接不好使了,大家可以关注公众号:羽毛的技术栈 回复dom4j 免费获取dom4j的jar包
使用IDEA如何导入jar包

Dom4j遍历XML

例子所遍历的XML文件内容为

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd">
<!-- 人力资源管理系统 -->
<hr>
    <employee no="1111">
        <name>张三</name>
        <age>18</age>
        <salary>4000</salary>
        <department>
            <dname>会计部</dname>
            <address>XX大厦</address>
        </department>
    </employee>

</hr>

通过dom4j遍历XML需要创建一个.java文件:

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import javax.xml.parsers.SAXParser;
import java.util.List;

public class HrReader {
    public void readXml(){
        //写入要读取的文件所在路径
        String file = "E:/JavaWeb/xml/src/hr.xml";
        //SAXReader 类是读取XML文件的核心类,用于将XML解析后以"树"的形式保存在内存中
        SAXReader reader = new SAXReader();
        try{
            //之前说过Dom4j将XML视为Document对象
            Document document = reader.read(file);
            //获取XML文档的根节点
            Element root = document.getRootElement();
            //element方法用于获取指定的标签集合
            List<Element> employees = (List<Element>) root.elements("employee");
            for(Element employee : employees){
                //用Attribute 遍历属性
                Attribute attribute = employee.attribute("no");
                System.out.println(attribute.getText());
                //直接通过 elementText() 方法来读出文本的值
                System.out.println(employee.elementText("name"));
                System.out.println(employee.elementText("age"));
                System.out.println(employee.elementText("salary"));
                //出现分支,获取节点
                Element department = employee.element("department");
                System.out.println(department.elementText("dname"));
                System.out.println(department.elementText("address"));
            }
        }catch (DocumentException e){
            e.printStackTrace();
        }
    }
    public static void main(String[] args){
        HrReader hrReader = new HrReader();
        hrReader.readXml();
    }
}

遍历结果为:
在这里插入图片描述
可以看出,已经成功读出了XML中存储的值

利用Dom4j更新XML

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class HrWriter {
    public void writerXml(){
        //获取将要更新的xml的文件路径
        String file = "E:/JavaWeb/xml/src/hr.xml";
        //SAXReader 类是读取XML文件的核心类,用于将XML解析后以"树"的形式保存在内存中
        SAXReader reader = new SAXReader();
        try{
            Document document = reader.read(file);
            //获取根节点
            Element root = document.getRootElement();
            //获取节点
            Element employee = root.addElement("employee");
            //addAttribute()是添加属性
            employee.addAttribute("no","3311");
            //addElement()是添加文本
            employee.addElement("name").setText("李铁柱");
            employee.addElement("age").setText("25");
            employee.addElement("salary").setText("3600");
            Element department = employee.addElement("department");
            department.addElement("dname").setText("人事部");
            department.addElement("address").setText("XX大厦-B105");
            //以上代码实现了在内存中生成的步骤,下面要来将内存中的东西写到xml文件中
            Writer writer = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
            document.write(writer);
            //用完之后要释放资源
            writer.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] args){
        HrWriter hrWriter = new HrWriter();
        hrWriter.writerXml();
    }
}

运行成功,xml文件中出现了我们添加的信息
在这里插入图片描述

XPath路径表达式

  • XPath路径表达式是XML文档中查找数据的语言。
  • 掌握XPath可以极大的提高在提取数据时的开发效率。
  • 学习XPath本质就是掌握各种形式表达式的使用技巧。

XPath基本表达式

表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.选取当前节点
选取当前节点的父节点
@选取属性

XPath基本表达式案例

路径表达式结果
bookstore选取bookstore元素的所有子节点
/bookstore选取根元素bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book选取属于bookstore的子元素的所有book元素
//book选取所有book子元素,而不管它们在文档中的位置
bookstore//book选择属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置。
//@lang选取名为lang的所有属性

XPath谓语表达式

路径表达式结果
/bookstore/book[1]选取属于bookstore子元素的第一个book元素。
/bookstore/book[last()]选取属于 bookstore子元素的最后一个book元素。
/bookstore/book[last()-1]选取属于bookstore子元素的倒数第二个book元素。
/bookstore/book[position()< 3]选取最前面的两个属于 bookstore元素的子元素的book元素。
//title[@lang]选取所有拥有名为 lang的属性的title 元素。
//title[ @lang=‘eng’]选取所有 title 元素,且这些元素拥有值为eng的lang属性。
/bookstore/book[price> 35.00]选取bookstore元素的所有book元素,且其中的price元素的值须大于35.00.
/bookstore/book[price> 35.00]/title选取bookstore元素中的book元素的所有title 元素,且其中的price元素的值须大于35.00

XPath实验

在使用XPath之前,需要做一些前置的准备工作,下载Jaxen并导入jar包

Jaxen介绍

  • Jaxen是一-个Java编写的开源的XPath库。这是适应多种不同的对象模型,包括DOM, XOM,dom4j和JDOM
  • Dom4j底层依赖Jaxen实现XPath查询
  • Jaxen 下载方式一: 地址— jaxen.codehaus.org (当然这个是被墙了的,如果没有翻出去的小伙伴可以通过另一种方法下载)
  • Jaxen 下载方式二 :打开阿里云的代码仓库https://maven.aliyun.com/mvn/search 然后搜索jaxen进行下载 (当然,如果还是觉得麻烦,那还有方式三)
  • Jaxen 下载方式三 :关注微信公众号:羽毛的技术栈 回复jaxen 免费获取jar包

使用IDEA而不会导入JAR包的看这里:使用IDEA如何导入jar包
这是需要查询的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd"><!-- 人力资源管理系统 -->
<hr>
    <employee no="3301">
        <name>张三</name>
        <age>18</age>
        <salary>4000</salary>
        <department>
            <dname>会计部</dname>
            <address>XX大厦-A104</address>
        </department>
    </employee>

    <employee no="3302">
        <name>李铁柱</name>
        <age>25</age>
        <salary>3600</salary>
        <department>
            <dname>人事部</dname>
            <address>XX大厦-B105</address>
        </department>
    </employee>

    <employee no="3303">
        <name>李二狗</name>
        <age>19</age>
        <salary>4500</salary>
        <department>
            <dname>会计部</dname>
            <address>XX大厦-A104</address>
        </department>
    </employee>

    <employee no="3304">
        <name>张顺溜</name>
        <age>29</age>
        <salary>4800</salary>
        <department>
            <dname>人事部</dname>
            <address>XX大厦-B105</address>
        </department>
    </employee>
    <employee no="3305">
        <name>李四</name>
        <age>25</age>
        <salary>5000</salary>
        <department>
            <dname>会计部</dname>
            <address>XX大厦-A104</address>
        </department>
    </employee>

    <employee no="3306">
        <name>王五</name>
        <age>27</age>
        <salary>6600</salary>
        <department>
            <dname>人事部</dname>
            <address>XX大厦-B105</address>
        </department>
    </employee>

</hr>

创建一个XPathTestor类

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.util.List;

public class XPathTestor {
    public void xpath(String xpathExp){
        String file = "E:/JavaWeb/xml/src/hr.xml";
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(file);
            List<Node> nodes = document.selectNodes(xpathExp);
            for(Node node : nodes){
                Element emp = (Element)node;
                System.out.println(emp.attributeValue("no"));
                System.out.println(emp.elementText("name"));
                System.out.println(emp.elementText("age"));
                System.out.println(emp.elementText("salary"));
                System.out.println("-------------------------------");
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args){
        XPathTestor xPathTestor = new XPathTestor();
        xPathTestor.xpath("/hr/employee");
    }
}

运行结果
在这里插入图片描述
这样就能使用XPath了,大家可以一一尝试Xpath的效果

本文若有错误,请各位指正, 最好的关系就是互相成就,关注羽毛,我们一同成长

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽 毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值