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。
相关文章推荐
- XML的解析DOM
- DOM解析XML文件
- JAVA 解析XML之DOM方式
- 用DOM解析XML时换行和空格
- xml生成、解析的四种方式,dom、sax、dom4j、jdom
- java中的xml简介与DOM解析xml
- Java DOM解析XML文件
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Xml文档解析工具比较 dom sax
- java-->dom方式解析xml
- Java解析XML文档——dom解析xml
- java DOM解析XML(2) 树
- android DOM解析Xml
- 解析XML-DOM查询2
- xml解析pull sax dom
- DOM解析XML
- Dom sax pull解析xml的差异
- XML解析——DOM方式
- Android之DOM解析XML
- 有关DOM解析xml