技术经验|Java-Web基础之XML解析JAXP-dom4j

2023-11-09 22:44:18 浏览数 (2)

1 XML介绍和解析方式

「XML解析介绍」

XML是标记型文档,js 使用 dom 解析标记型文档是根据 html 的层级结构,在内存中分配一个属性结构,把 html 的标签,属性和文本都封装成 document 对象、element 对象,属性对象、文本对象,node 节点对象。

2 dom4j解析XML

2.1 dom4j概述

Dom4j是一个组织,针对xml解析,提供解析器,dom4j后来独立成一个公司,他的性能比jdom更加强大。

我们如果想要使用Dom4j,需要引入dom4j提供依赖接口。在Maven项目中,导入依赖包很简单、容易。

2.2 引入dom4j依赖

首先在maven依赖仓库找到dom4j的依赖,然后将他拷贝到我们的pom.xml中。

「查找依赖包」

「导入到pom文件」

pom.xml

代码语言:javascript复制
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>
    </dependencies>

2.3 使用dom4j查询xml

首先创建persons.xml,我们还是使用上章节的文件。然后创建一个Dom4jParserXmlTest.java类。

「步骤」

1、创建解析器

2、获取Document对象

3、获取根元素

4、解析操作

代码语言:javascript复制
    public static void main(String[] args) {

        String xmlPath = "./tool-jdk8/src/main/java/com/xxx/tooljdk/xml/persons.xml";

        // 1、创建解析器
        SAXReader saxReader = SAXReader.createDefault();
        try {

            // 2、获取Document对象
            Document document = saxReader.read(new File(xmlPath));

            // 3、获取根元素
            Element rootElement = document.getRootElement();

            // 4、解析操作
            System.out.println("输出全部xml:"   rootElement.asXML());

        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    }

执行操作之后,我们可看到如下信息:

代码语言:javascript复制
<persons>
	<person sid="001" uid="QS#123">
		<name>张小帅</name>
		<sex>男</sex>
		<age>28</age>
	</person>
	<person sid="002">
		<name>刘晓萌</name>
		<sex>女</sex>
		<age>21</age>
	</person>
	<person sid="003">
		<name>王老四</name>
		<sex>男</sex>
		<age>38</age>
	</person>
</persons>

Dom4j的常用API说明:

方法

操作

Element getRootElement();

获取XML文件的根节点

String getName();

返回标签的名称

List < Element > elements();

获取标签所有的子标签

String arrtributeVallue(String name) ;

获取指定属性名称的属性值

String getText();

获取标签的文本

String elementText(String name);

获取指定名称的子标签的文本,返回子标签文本的值

2.4 新增元素

代码语言:javascript复制
Element sex1 = p1. addElement("content");

注意⚠️:这个操作与之前所说的操作和方法不一样,之前用jip时需要先创建,但现在不需要创建,直接在下面添加元素。

2.5 新增元素的文本

代码语言:javascript复制
sex1.setText("测试");

2.6 回写到xml

「方法一」

代码语言:javascript复制
OutputFormat  format  =  outputFormat.createPrettyPrint();

注意⚠️:可以有缩进的效果。这个方法是静态的,直接用outputFormat.createPrettyPrint进行格式化。

「方法二」

代码语言:javascript复制
OutputFormat format =outputFormat.createCompactFormat();

这个方法有压缩的效果,一般运用在计算机里,企业用第一种方法。

代码语言:javascript复制
XMLWriter  xmlwriter  =  new XMLWriter(new Fileoutputstream("src/p1.xml"),format);
xmlWriter.write(document);

把内存中的数写入到文件里去,括号里传入document,这样就把文档传入到xml文件里去。

代码语言:javascript复制
xmlWriter.close();

关流,注意流一旦打开就要关闭

3 dom4j结合XPath解析XML

3.1 引入jaxen依赖

同样,依赖第三方jar时,我们需要引入依赖包。

代码语言:javascript复制
<!-- https://mvnrepository.com/artifact/jaxen/jaxen -->
<dependency>
    <groupId>jaxen</groupId>
    <artifactId>jaxen</artifactId>
    <version>1.2.0</version>
</dependency>

3.2 使用XPath解析xml

Dom4j提供基于XPath的API

方法

操作

Node selectSingleNode(String xpathExpression);

根据XPath表达式获取单个标签(元素/节点)

List < Node > selectNodes(String xpathExpression)

根据XPath表达式获取多个标签(元素/节点)

「步骤」 1、获取解析器

2、获取Document对象

3、获取元素解析

代码语言:javascript复制
public static void main(String[] args) {

        String xmlPath = "./tool-jdk8/src/main/java/com/liuyc/tooljdk/xml/persons.xml";

        SAXReader saxReader=new SAXReader();

        try {
            Document document= saxReader.read(new File(xmlPath));
            // 拿到第一个用户的姓名
            System.out.println("1.------>使用绝对路径方式来查找元素");
            Element element = (Element) document.selectSingleNode("/persons/person/name");
            String nameEle = element.getText();
            System.out.println(nameEle);

            System.out.println("2.------>使用相对路径查找元素");
            // element是当前获取的name元素
            Element name = (Element) element.selectSingleNode("../name");
            System.out.println("第一个用户的姓名为" name.getText());

            System.out.println("3.------>使用全局搜索的方式");
            //获取所有的id元素的文本
            List<Node> idNodeList = document.selectNodes("//sid");
            for (Node node : idNodeList) {
                Element idElement=(Element) node;
                System.out.println(idElement.getText());
            }
            System.out.println("4.------>谓语形式");
            //获取id=10002的用户信息
            Element idElement = (Element) document.selectSingleNode("//person[@sid='002']");
            List<Element> elements = idElement.elements();
            for (Element element1 : elements) {
                System.out.println(element1.getName() "=" element1.getText());
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

「解析后的结果」

代码语言:javascript复制
1.------>使用绝对路径方式来查找元素
张小帅
2.------>使用相对路径查找元素
第一个用户的姓名为张小帅
3.------>使用全局搜索的方式
4.------>谓语形式
name=刘晓萌
sex=女
age=21

0 人点赞