您的位置:首页 > 其它

dom4kj解析xml

2019-05-27 14:29 435 查看
[code]xml解析你们都清不清楚,你们之前都学过没有,我记得是刚开始学JAVA的时候,可能都讲过XML的解析的,XML解析清不清楚,

外面有很多关于XML解析的框架,在这里我就讲一下DOM4J怎么解析的,我们讲一下XML怎么做解析,我们这里有一个xml,

有一个根节点,有student1,有student2,是不是这样的,我们之前的Spring的配置文件,他其实也是这样的,id叫做属性,

还有属性的value,待会我给你们大体演示一下,你们把全部的依赖都依赖一下,maven相关的依赖
[code]<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.learn</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- 引入Spring-AOP等相关Jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1_2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>

<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>

</dependencies>

</project>
[code]<?xml version="1.0" encoding="UTF-8"?>
<students>
<student1 id="001">
<微信公众号>每特学院</微信公众号>
<学号>20140101</学号>
<地址>北京海淀区</地址>
<座右铭>要么强大,要么听话</座右铭>
</student1>
<student2 id="002">
<新浪微博>蚂蚁课堂</新浪微博>
<学号>20140102</学号>
<地址>北京朝阳区</地址>
<座右铭>在哭泣中学会坚强</座右铭>
</student2>
</students>
[code]<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">

<!--
读取到节点的属性,获取到id的属性,拿到一个service之后,我再获取class地址,
然后获取到class地址之后,利用反射机制去获取对象,这个过程就是这样的
-->
<bean id="userService" class="com.learn.service.impl.UserServiceImpl">
</beans>
[code]package com.learn;

import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
* 首先获取当前节点的名称
* 是不是先拿到students的根节点
* 然后内容是为空的
* 然后获取他的子节点
* 然后获取到子节点上的属性
* 然后属性有这样的一个id
* 然后属性的内容为多少
* 是不是001
* 看到没有
* 所以大家记住这个方法
* 获取节点上的属性
* attribute.getText()
* 这个是获取属性的内容
* 马上我们就要用到这个API了
* 其实Spring里面也是这么写的
* API我就不去细说了
* 反正大家要记住这个API
* 获得属性
* 就可以获得传入的值
*
* 怎么解析XML比较简单
* 你只要记得API获取当前节点的属性
* XML与JSON的区别
* XML一般是属于重量级的
* 占用宽带比较大的
* JSON是轻量级的
* Rest进行请求方式的
* 因为JSON格式是轻量级的
* 而且定义起来也比较简单
* 我在互联网项目开发的时候
* 很少用到这样一个XML
* 都是JSON
* 除了和银行对接会用到XML之外
* 基本上都是用JSON
* 所以给大家说一下
* 一定要把JSON学好
* 怎么去解析JSON
* 因为JSON在企业中也是用的比较多的
* 还有XML怎么解析
* 基本的几个API
* 报文格式也有XML的
* 我觉得XML格式真的特别少
* 都是用JSON格式的
* 这个过程我就不去细说了
* 一般互联网项目都是用JSON作通信的
* Restful风格
* webservice底层遵循SOAP
* XML报文传输的
* 所以可能还是有很大的区别的
* 你们肯定用的是webservice
* 互联网项目我是没见过用xml方式的
* 都是用JSON格式的
*
*
*
* @author Leon.Sun
*
*/
public class XmlUtils {

public static void main(String[] args) throws Exception {
XmlUtils xmlUtils = new XmlUtils();
xmlUtils.test001();
}

public void test001() throws Exception {
SAXReader saxReader = new SAXReader();
/**
* 你可以写完整的路径地址
* 我不建议写类的完整路径地址
* 怎么做呢
* 你直接把student.xml文件copy到目录里面去
* 怎么获取上下文路径
* 获得我的项目的上下文路径
* 怎么获取
* 你们不要去读F盘的xml
* 怎么做呢
* 在这里我要讲个方法
* 叫做什么方法呢
* 这个方法
*
* 这里只是读取一个xml文件
* 读取完了之后我们在第二步怎么去做呢
*
*/
Document read = saxReader.read(getClassPath("student.xml"));
// 获取根节点
/**
* 读取根节点
* 再读取到子节点
* 通过递归算法不停的去调用
* 读取当前节点的下个节点的一个信息
* 在这里我们可以拿到他的根节点
* 然后拿到Document对象
* 然后再从根节点开始读
* 拿到root节点之后
* 我们要写一个方法来读取下面的子节点
*
*/
Element rootElement = read.getRootElement();
getNodes(rootElement);
}

public InputStream getClassPath(String xmlPath) {
/**
* getClass().getClassLoader()他可以获取你上下文路径
* 最好你把它封装一下
* 我们拿到一个InputStream
* 把xmlPath这个传进去
* 就得到一个InputStream流
* 拿到之后我们就直接返回出来
*
*/
InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(xmlPath);
return resourceAsStream;
}

/**
* 这里就是用递归的不停的往下个节点读取
* 像是二叉树结构一样的
* 传入一个Element对象
* 这里我们怎么去进行做
*
*
* @param rootElement
*/
public static void getNodes(Element rootElement) {
/**
* 先获取到节点名称
* rootElement.getName()
* 获取当前节点的名称
* 获取完了以后
* 下面还有很多属性方法
*
*/
System.out.println("获取当前名称:" + rootElement.getName());
// 获取属性信息
/**
* 获取属性方法
* 里面怎么去写呢
* 这里是属性
* 最好是用泛型接收
*
*
*/
List<Attribute> attributes = rootElement.attributes();
/**
* 去遍历一下
* 这个属性有什么信息呢
*
*
*/
for (Attribute attribute : attributes) {
/**
* 这里面有几个方法
* 第一个方法是getName
* 表示属性的名称
* 然后还有个getText
* 获取别人的内容
* 待会会细讲几个API的
* 先去手写一下这几个API
* 获取完属性之后呢
* 获取属性的value
*
*
*/
System.out.println("属性:" + attribute.getName() + "---" + attribute.getText());
}
/**
* 获取属性的value
* 去空格然后拿到
7ff7
一下
*
*/
String value = rootElement.getTextTrim();
if (!StringUtils.isEmpty(value)) {
System.out.println("value:" + value);
}
// 使用迭代器遍历,继续遍历子节点
/**
* 你要递归往下个节点读取的话
* 就会用到一个递归算法
* 这里最好是加上一个泛型Element
* 遍历的时候是可以获取到一个类型的
*
*
*/
Iterator<Element> elementIterator = rootElement.elementIterator();
/**
* 使用迭代器
* 获取子节点的信息
* 拿到迭代器后进行while循环
* 相当于迭代器里有下个节点
* 如果有下个节点就让他继续的
*
*/
while (elementIterator.hasNext()) {
Element next = elementIterator.next();
/**
* 这里不要传root
* 而是要传当前的这个节点
*
*
*/
getNodes(next);
}
}
}
[code]什么是XML
它是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言。
XML 全称为可扩展的标记语言。主要用于描述数据和用作配置文件。
XML 文档在逻辑上主要由一下 5 个部分组成:
XML 声明:指明所用 XML 的版本、文档的编码、文档的独立性信息
文档类型声明:指出 XML 文档所用的 DTD
元素:由开始标签、元素内容和结束标签构成
注释:以结束,用于对文档中的内容起一个说明作用
处理指令:通过处理指令来通知其他应用程序来处理非 XML 格式的数据,格式为
XML 文档的根元素被称为文档元素,它和在其外部出现的处理指令、注释等作为文档实体的子节点,
根元素本身和其内部的子元素也是一棵树。
[code]Dom4j与Sax区别
dom4j不适合大文件的解析,因为它是一下子将文件加载到内存中,所以有可能出现内存溢出,sax是基于事件来对xml进行解析的,
所以他可以解析大文件的xml,也正是因为如此,所以dom4j可以对xml进行灵活的增删改查和导航,而sax没有这么强的灵活性,
所以sax经常是用来解析大型xml文件,而要对xml文件进行一些灵活(crud)操作就用dom4j。
[code]XML与JSON区别
Xml是重量级数据交换格式,占宽带比较大。
JSON是轻量级交换格式,xml占宽带小。
所有很多互联网公司都会使用json作为数据交换格式
很多银行项目,大多数还是在使用xml。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: