java解析XML详解


Posted in Java/Android onJuly 09, 2021
目录
  • XML的主要用途
    • 对比HTML
    • 关于XML文件的解析?
    • JDK自带的一套解析
  • 总结

 

XML的主要用途

  • --数据存储和数据描述
  • --是一个优良的配置文件
  • --相当于一个小型数据库
  • --XML不依赖于任何一种编程语言,是独立的W3C提供的规范,所以可以完成多种语言之间的数据交换(重点)

XML的语法严格,并且完全区分大小写

  • XML(eXtensible Markup Language)-描述事物本身 .xml

java解析XML详解

XSL (eXtensible Stylesheet Language)-修饰XML XSL文件也有单独的文件,文件后缀 .xsl

通过以下陈程序引入xsl文件

<?xml-stylesheet type="text/xsl" href="student.xsl"?>

DTD (Docment Type Definition)-约定xml的标签 在XML文件中只能编写那些标签,标签中只能编写那些属性 DTD有单独的文件,文件后缀 .dtd

DTD实例

java解析XML详解

Schema-约定xml标签和类型,比DTD编写更加方便,(约束XML文件) schema有单独的文件,文件后缀 .xsd/.xml

实例是:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="丛书">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="书">
					<xs:element name="名"  minoccurs="1"></xs:element>
					<xs:element name="人"></xs:element>
					<xs:element name="价">
						<xs:attribute name="unit">
							<xs:enumeration value="RMB"/>
							<xs:enumeration value="美元"/>
							<xs:enumeration value="日元"/>
						</xs:attribute>
					</xs:element>
				</xs:element>
		</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

可以扩展的原因:DTD可以修改

 

对比HTML

HTML(Hyper Text Markup language

*超文本传输标记语句(程序员不能自己扩展)

*HTML主要用途:做页面展示,不会做数据处理

*语法松散,不区分大小写

CSS

DTD(Doucment Type Defined)约束HTML能有那些标签,标签能有那些属性

schema (DTD的升级版,语法更新一些,和DTD达到同等效果)

不可扩展原因:DTD不可扩展

 

关于XML文件的解析?

*无论是哪一种编程语言,对XML文件的解析都包括两种方式:

*DOM解析

*SAX解析(org.xml.sax.helps DefaultHandler)

DOM解析

*原理

在开始解析XML文件的时候,将整个XMl文件全部加载到内存中

在内存中编程语言将XML文件映射成一颗DOM树,这颗树就是一个

对象,然后我们对这棵树上的任意节点进行增删改查操作,由于

这棵树全部都在内存上,解析过去的节点可以再次解析,比较灵活。

*优点

灵活,解析过去的节点,可以再次解析

*缺点

如果XML文件比较大,可能会导致内存溢出,即使不导致内存溢出,

也会耗费大量内存,内存少了项目的运行效率自然就降低了。

*什么情况下选择dom解析方式

如果很灵活的操作每一个元素,选用dom解析,但是注意文件需要小一些

SAX解析

*原理

SAX解析是基于事件驱动型的解析方式,他的解析不需要将整个XML文件全部

转载到内存中,解析的时候是有顺序的,在XML文件中从上往下依次解析,遇

到开始标签,表示发生了一个特定的事件,此时执行一段特定的程序,遇到结束

标签表示又发生一个特定事件,此时执行一段特定的程序完成解析。

*优点

不需要转载XML文件,所以不会占用大量内存, 适合大文件

*缺点

解析过去的节点不能重复解析,除非重头开始

*什么情况下选择SAX解析方式

大文件适合使用SAX解析

作为程序员如何解析XML文件,解析XMl文件的开源项目都包括那些?

java解析XML相关的开源项目

*DOM4j(Dom for Java)

*JDOM

.....

JDK自带一套,是实现W3C规范的

*org.w3c.com.*; 基于DOM解析

*org.xml.sax.*; 基于SAX解析

为了提高我们解析XMl文件的效率,还涉及到XPATH。(是一种标签匹配方式,类似于正则表达式,可以让我们程序快速定位XML文件中的标签)

解析XML文件涉及到:

DOM4j/JDOM/W3C+......Xpath

 

JDK自带的一套解析

首先在src目录下创建一个xml文件

java解析XML详解

以下为解析过程

/**
 * 使用JDK自带的"Dom解析"XML文件(读)
 */
public class Text04 {
    public static void main(String[] args) throws Exception {
        //创建文档解析器工厂对象
        DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
        //创建文档解析器对象
        DocumentBuilder builder=factory.newDocumentBuilder();
        //开始解析XML文件
        String path=Thread.currentThread().getContextClassLoader().getResource("db-config.xml").toURI().getPath();
        Document document =builder.parse(new File(path));//dom树,在内存中生成了一颗dom树
        //获取根元素
        Node rootNode=document.getFirstChild();
        //获取根元素的名字
        System.out.println(rootNode.getNodeName());
        //通过根元素获取其他元素
        Node driverNode=document.getElementsByTagName("driver").item(0);
        String driver =driverNode.getTextContent();
        System.out.println(driver);
    }
}

输出结果

java解析XML详解

使用dom4j开源项目(基于dom解析)解析xml文件(读)

需要将dom4j开源项目的jar包作为目录导入

/**
 * 使用dom4j开源项目解析XML文件(读)
 *
 * 读XML文件
 *
 * DOM4j
 *
 * 基于dom方式
 */
public class Text01 {
    public static void main(String[] args) throws Exception {
        //创建解析器对象
        SAXReader reader=new SAXReader();//虽然使用了SAXReader,但是还是基于DOM的解析方式
        //获取文档对象,还是dom树
        String path=Thread.currentThread().getContextClassLoader().getResource("db-config.xml").toURI().getPath();
        Document document= reader.read(new File(path));
        //获取根元素
        Element rootElement=document.getRootElement();
        //System.out.println(element.getName());
        //获取driver元素
        Element driverElement =rootElement.element("driver");
        //在获取文本
        String driver=driverElement.getText();
        //System.out.println(driver);
        //直接获取元素的文本内容
        driver=rootElement.elementText("driver");
        System.out.println(driver);
        System.out.println(rootElement.elementText("url"));
        System.out.println(rootElement.elementText("user"));
        System.out.println(rootElement.elementText("password"));

    }
}

输出结果

java解析XML详解

使用dom4j开源项目(基于dom解析)解析xml文件(写)

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileWriter;
/**
 * 使用dom4j开源项目解析XML文件(写)
 */
public class Text02 {
    public static void main(String[] args) throws Exception {
        //创建文档对象
        Document document= DocumentHelper.createDocument();
        //添加根元素
        Element studentInfoElt=document.addElement("学生信息");
        //给学生信息节点添加子节点学生节点
        Element studentElt=studentInfoElt.addElement("学生");
        //给学生节点添加id属性
        studentElt.addAttribute("id","110");
        //给学生节点添加名字字节点
        Element nameElt=studentElt.addElement("名字");
        //设置名字节点文本
        nameElt.setText("张三");
        //给学生节点添加性别字节点
        Element sexElt=studentElt.addElement("性别");
        //设置名字节点文本
        sexElt.setText("男");
        //开始写
        OutputFormat format= OutputFormat.createPrettyPrint();
        format.setEncoding("utf-8");
        String path="students.xml";
        XMLWriter xmlWriter=new XMLWriter(new FileWriter(new File(path)),format);
        xmlWriter.write(document);
        xmlWriter.close();

    }
}

最终生成的xml文件

java解析XML详解

 

总结

本篇文章就到这里了,希望能给你带来帮助,也希望你能够多多关注三水点靠木的更多内容!

Java/Android 相关文章推荐
深入理解java.lang.String类的不可变性
Jun 27 Java/Android
Java 语言中Object 类和System 类详解
Jul 07 Java/Android
springboot 启动如何排除某些bean的注入
Aug 02 Java/Android
java多态注意项小结
Oct 16 Java/Android
JavaWeb实现显示mysql数据库数据
Mar 19 Java/Android
spring注解 @PropertySource配置数据源全流程
Mar 25 Java/Android
Java 多态分析
Apr 26 Java/Android
Jmerte 分布式压测及分布式压测配置
Apr 30 Java/Android
springboot实现string转json json里面带数组
Jun 16 Java/Android
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
Jul 15 Java/Android
Android实现获取短信验证码并自动填充
May 21 Java/Android
使用@Value值注入及配置文件组件扫描
Jul 09 #Java/Android
详细了解MVC+proxy
Jul 09 #Java/Android
Spring实现内置监听器
Jul 09 #Java/Android
新手初学Java网络编程
Jul 07 #Java/Android
Java 语言中Object 类和System 类详解
Jul 07 #Java/Android
新手初学Java List 接口
Jul 07 #Java/Android
Spring Boot 整合 Apache Dubbo的示例代码
Jul 04 #Java/Android
You might like
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
Node.js中的事件驱动编程详解
2014/08/16 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
浅谈Vue数据响应思路之数组
2018/11/06 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
Python解析nginx日志文件
2015/05/11 Python
Python类的用法实例浅析
2015/05/27 Python
Python数据类型详解(一)字符串
2016/05/08 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
Python中生成器和迭代器的区别详解
2018/02/10 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
python中return如何写
2020/06/18 Python
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
英国二手物品交易网站:Preloved
2017/10/06 全球购物
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
收银出纳员岗位职责
2014/02/23 职场文书
2015大学生求职信范文
2015/03/20 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
JS数组方法some、every和find的使用详情
2021/10/05 Javascript
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技