Java的XML解析
XML:(eXtensible Markup Language)
可扩展标记语言
是一种数据格式,用于存储和传输数据
声明一个xml文件
<?xml version="1.0" encoding="UTF-8" ?>
文档类型定义
<!DOCTYPE note SYSTEM “book.dtd”>
only:有且只有一个跟节点
一个例子
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
特殊字符
在 XML 中,有 5 个预定义的实体引用:

格式验证
浏览器打开不报错,就ok
Java的XML解析的3个方法:
1.DOM(Document Object Model)
文档对象模型
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<select id="findUserById" parameterType="int" resultType="com.lucas.javase.mybatis.introduction.po.User" >
SELECT * FROM user WHERE id = #{id}
</select>
<select id="findUserListByName" parameterType="string" resultType="com.lucas.javase.mybatis.introduction.po.User">
SELECT * FROM user WHERE username LIKE '%${value}%'
</select>
<insert id="insertUser" parameterType="com.lucas.javase.mybatis.introduction.po.User" useGeneratedKeys="true">
INSERT INTO user (username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})
</insert>
</mapper>
Dom.java
static String uri="UserMapper.xml";
public static void dom() throws ParserConfigurationException, SAXException, IOException{
//DocumentBuilderFactory是抽象类,不能实例化new
DocumentBuilderFactory instance = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = instance.newDocumentBuilder(); Document document = builder.parse(uri);
print(document,0);
} private static void print(Node document, int i) {
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
switch (document.getNodeType()) {
case Node.DOCUMENT_NODE:
System.out.println("DOCUMENT_NODE: "+document.getNodeName());
break;
case Node.ELEMENT_NODE:
System.out.println("ELEMENT_NODE: "+document.getNodeName());
break;
case Node.TEXT_NODE:
System.out.println("TEXT_NODE: "+document.getNodeName()+"="+document.getNodeValue());
break;
case Node.ATTRIBUTE_NODE:
System.out.println("ATTRIBUTE_NODE: "+document.getNodeName()+"="+document.getNodeValue());
break;
case Node.CDATA_SECTION_NODE:
System.out.println("CDATA_SECTION_NODE: "+document.getNodeName()+"="+document.getNodeValue());
break;
case Node.COMMENT_NODE:
System.out.println("COMMENT_NODE: "+document.getNodeName()+"="+document.getNodeValue());
break;
default:
System.out.println("NODETYPE:"+document.getNodeType()+",NODEVALUE:"+document.getNodeValue());
break;
}
for (Node child = document.getFirstChild(); child !=null; child=child.getNextSibling()) {
print(child,i+1);
}
}
输出
DOCUMENT_NODE: #document
NODETYPE:10,NODEVALUE:null
ELEMENT_NODE: mapper
TEXT_NODE: #text= ELEMENT_NODE: select
TEXT_NODE: #text=
SELECT * FROM user WHERE id = #{id} TEXT_NODE: #text= ELEMENT_NODE: select
TEXT_NODE: #text=
SELECT * FROM user WHERE username LIKE '%${value}%' TEXT_NODE: #text= ELEMENT_NODE: insert
TEXT_NODE: #text=
INSERT INTO user (username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address}) TEXT_NODE: #text=
缺点是:一次性加载整个dom,占用内存大,速度慢
2、SAX(Simple API for XML)
XML的简单接口
Sax.java
public static void sax() throws ParserConfigurationException, SAXException, IOException{
//SAXParserFactory也是抽象类
SAXParserFactory instance = SAXParserFactory.newInstance();
SAXParser saxParser = instance.newSAXParser();
saxParser.parse(uri, new SaxHandler());
}
SaxHandler.java
public class SaxHandler extends DefaultHandler{
void print(Object...objects){
for (Object object : objects) {
System.out.print(object);
System.out.print(" ");
}
}
@Override
public void startDocument() throws SAXException {
System.out.println("startDocument");
}
@Override
public void endDocument() throws SAXException {
System.out.println("endDocument");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("startElement "+localName+" "+qName);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("endElement "+localName+" "+qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println("characters "+new String(ch,start,length));
}
@Override
public void error(SAXParseException e) throws SAXException {
print("error:",e);
}
}
输出
startDocument
startElement mapper
startElement select
characters
SELECT * FROM user WHERE id = #{id} endElement select
startElement select
characters
SELECT * FROM user WHERE username LIKE '%${value}%' endElement select
startElement insert
characters
INSERT INTO user (username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address}) endElement insert
endElement mapper
endDocument
流式读取dom,占用内存小,速度快,基于事件,使用事件回调处理dom
3、Jackson
这个一个开源XML工具
引入依赖包,maven的pom.xml
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.woodstox</groupId>
<artifactId>woodstox-core</artifactId>
<version>5.1.0</version>
</dependency>
需要序列化的类
User.java
public class User {
private int id;
private String username;
private String sex;
private String birthday;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
+ address + "]";
}
public User() {
}
public User(int id, String username, String sex, String birthday, String address) {
super();
this.id = id;
this.username = username;
this.sex = sex;
this.birthday = birthday;
this.address = address;
}
}
Jackson.java
public class Jackson {
public static void main(String[] args) {
try {
//jacksonBean2XML();
jacksonXML2Bean();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* POJO 转为XML
*
* @throws JsonProcessingException
*/
public static void jacksonBean2XML() throws JsonProcessingException{
// JacksonXmlModule module = new JacksonXmlModule();
// module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.setDefaultUseWrapper(false);
User user=new User(1,"lucas","nan","2019-10-01","上海");
String xml=xmlMapper.writeValueAsString(user);
System.out.println(xml);
}
public static void jacksonXML2Bean() throws JsonParseException, JsonMappingException, IOException{
// JacksonXmlModule module = new JacksonXmlModule();
// module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.setDefaultUseWrapper(false);
//自动忽略无法对应pojo的字段
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
User user=xmlMapper.readValue("<User><id>1</id><username>lucas</username><sex>nan</sex><birthday>2019-10-01</birthday><address>上海</address></User>", User.class);
System.out.println(user);
}
}
使用第三方的工具,更加方便,面向对象开发。
Java的XML解析的更多相关文章
- 【Java】XML解析之DOM4J
DOM4J介绍 dom4j是一个简单的开源库,用于处理XML. XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP,使用需要引用dom4j.jar包 ...
- 【Java】XML解析之SAX
SAX介绍 SAX(Simple API for XML)是一种事件驱动的流式XML文件处理方式,区别与DOM方式的是不需要在内存中建一棵DOM树,而是根据读取XML时遇到的标签事件来顺序处理,因此具 ...
- 【Java】XML解析之DOM
DOM介绍 DOM(Document Object Model)解析是官方提供的XML解析方式之一,使用时无需引入第三方包,代码编写简单,方便修改树结构,但是由于DOM解析时是将整个XML文件加载到内 ...
- java之xml解析-dom4j
解析方式 XML 解析方式有很多种,但是常用的有两种,如下: DOM Document Object Model:把整个 XML 读到内存中,形成树状结构.整个文档为 Document 对象,属性为 ...
- 【Java】XML解析之JDOM
JDOM介绍 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析.生成.序列化以及多种操作.使用jdom需要引入jdom.jar包. XML生成及解析 代码如下: pac ...
- Java笔记——XML解析
import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import ja ...
- java的XML解析(DOM4J技术)
DOM4J技术解析XML文件 一,XML简介 xml (可扩展标记语言) 全称: Extended Markup Language 可扩展的含义:允许程序员按照自己的想法去扩展新的标签 注意:但是扩 ...
- java:xml解析
DOM.SAX.JDOM.DOM4J四种解析:https://www.cnblogs.com/longqingyang/p/5577937.html Java解析XML文件例子:https://blo ...
- java dom xml解析和windows dom解析的差别
1.java dom 子节点包括空节点. 2.java dom 文档节点值也是其的子节点. 而windows dom(mshtml.dll)子节点不包括空节点,而节点值也不是以子节点的方式来对待的.
随机推荐
- mui.init方法配置
mui框架将很多功能配置都集中在mui.init方法中,要使用某项功能,只需要在mui.init方法中完成对应参数配置即可,目前支持在mui.init方法中配置的功能包括: 创建子页面. 关闭页面. ...
- 《Linux就该这么学》第八天课程
当一个人的心中,有着更高的山峰想要去攀登时,他就不会在意脚下的泥沼. 今天发一下干货,常用命令的一些总结,今天的理论知识比较多. 原创地址:https://www.linuxprobe.com ...
- 秒杀系统-service
在Dao层我们只完成了针对表的相关操作,包括写了接口方法和映射文件中的sql语句,并没有编写逻辑的代码,例如对多个Dao层方法的拼接,当我们用户成功秒杀商品时我们需要进行商品的减库存操作(调用Seck ...
- h5移动网页唤起App
最近这个困惑了很久,不断的有一些坑,目前还有疑问关于iOS唤起无效时会出现弹框的问题,这个最后再说 1.首先可能需要判断当前浏览器的来源(目前开发的App还没有上架,所以针对腾讯出品的大家广为人知的微 ...
- wx:for类表渲染
列表渲染 wx:for 在组件上使用wx:for控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件. 默认数组的当前项的下标变量名默认为index,数组当前项的变量名默认为item < ...
- Alpha代码规范、冲刺任务与计划
Alpha代码规范.冲刺任务与计划 团队名称: 云打印 作业要求: Alpha代码规范.冲刺任务与计划 作业目标:代码规范.冲刺任务与计划. 团队队员 队员学号 队员姓名 个人博客地址 备注 2216 ...
- centoos内核升级
1.检查当前CentOS内核版本 uname -r 2.导入key 打开http://elrepo.org/tiki/tiki-index.php 复制执行该命令 3.安装ELRepo 打开2步中的网 ...
- jQuery判断复选框checkbox的选中状态
通过jQuery设置复选框为选中状态 复选框 <input type="checkbox"/> 错误代码: $("input").attr(&quo ...
- 基于vue的颜色选择器vue-color-picker
项目中有用到颜色选择器的童鞋们可以看过来了 关于color-picker的jquery的插件是有蛮多,不过vue组件没有吧,反正我没有找到, 虽然element-ui里面有这个,但是你愿意为了一个小功 ...
- https网页加载http资源导致的页面报错及解决方案
https是当下的网站的主流趋势,甚至像苹果这样的大公司,则完全要求用户必须使用https地址. 然而对于以前http链接来说,我们往往就存在一个兼容性问题,因为你不可能一下就全部切换过去,应该在很长 ...