深入解读XML解析
一、XML是什么?有什么用?
XML是指可扩展标记语言(eXtensible MarkupLanguage),它是一种标记语言。它被设计的宗旨是描述数据(XML),而非显示数据(HTML)。
目前遵循的是W3C组织于2000年发布的XML1.0规范
二、XML的基本语法
1、文档声明:很重要
在编写XML文档时,需要先使用文档声明来声明XML文档。且必须出现在文档的第一行。
作用:告知解析器,我是一个XML文档。
最简单的声明语法:
<?xml version="1.0"?> 中间不要加空格,后面加?号
当我们写好的一个xml文件写入内存的时候会转换为二进制保存,这个时候会查码表,记事本保存的时候是gbk,而保存的时候默认查码表时用的是utf-8,
这个时候我们就可以用encoding属性:默认是UTF-8 <?xml version="1.0" encoding="GBK"?>,这样就可以解决乱码等问题。
standlone属性:该xml文件是否独立存在。
2、元素(标签)
XML语法非常严格。不能够省略结束标签。
一个XML文档必须有且仅有一个根标签
XML中不会忽略主体内容中出现的空格和换行
元素(标签)的名称可以包含字母、数字、减号、下划线和英文句点,但必须遵守下面的一些规范:
l 严格区分大小写;<P> <p>
l 只能以字母或下划线开头;abc _abc
l 不能以xml(或XML、Xml等)开头----W3C保留日后使用;
l 名称字符之间不能有空格或制表符;ab
l 名称字符之间不能使用冒号; (有特殊用途)
3、元素的属性
属性值一定要用引号(单引号或双引号)引起来
元素中属性不允许重复
4、注释
XML中的注释语法为:<!--这是注释-->
XML声明之前不能有注释 不允许第一行写注释(不同于java)
5、CDATA区
Character Data:字符数据。
语法:
<![CDATA[
内容
]]>
作用:
被CDATA包围的内容,都是普通的文本字符串。
6、特殊字符
特殊字符 替代符号
& &
< <
> >
" "
' &apos
三、XML的约束
XML可以自定义。如果作为配置文件。
格式良好的XML文档:遵循XML语法的。
有效的XML文档:遵守约束的XML文档。
有效的XML文档必定是格式良好的,但良好的不一定是有效的。
1、DTD约束:(能看懂DTD即可)
a、DTD(Document Type Definition):文档类型定义
作用:约束XML的书写规范
注意:dtd可以写在单独的文件中,扩展名是dtd,且必须使用UTF-8编码进行保存。
b、XML文档中如何导入DTD约束文档(XML外部)
l dtd文档在本地:
<!DOCTYPE 根元素 SYSTEM "dtd文件的路径">
l dtd文档在网络上:
<!DOCTYPE 根元素 PUBLIC "dtd名称" "DTD文档的URL链接地址">
四、利用Java代码解析XML文档
1、解析方式
l DOM:Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种标准方式。
缺点:必须读取整个XML文档,才能构建DOM模型,如果XML文档过大,造成资源的浪费。
优点:适合对XML中的数据进行操作(CRUD)。
l SAX:Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
2、解析工具
JAXP:
DOM或SAX方式进行解析XML。API在JDK之中。
Dom4J:(推荐)
是开源组织推出的解析开发包。(牛,大家都在用,包括SUN公司的一些技术的实现都在用)
五、JAXP进行DOM方式解析XML基本练习
1、JAXP简介:
开发包:(JDK中)
DOM:W3C。org.w3c.dom.* DOM规范。(接口/抽象类)
SAX:开源组织。org.xml.sax.* SAX规范。(接口/抽象类)
JAXP:javax.xml.*
sax解析原理
在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。
SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器: 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。 解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。 事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理
基本解析操作
//1解析器
SAXParser parse = SAXParserFactory.newInstance().newSAXParser();
//2获取xml读取器
XMLReader reader = parse.getXMLReader();
//3注册内容处理器
reader.setContentHandler(new ContentHandler1());
//4读取xml文档
reader.parse("src/book.xml");