概述
xml和html一样都是标签语言
xml:eXtensible Markup Language
可扩展标记语言
该标记语言作为接口语言使用的非常多
html:标签是固定标签,负责数据展示,结构和样式结合在一起,HTML语法松散
xml:标签是可以自定义的,负责数据存储,结构和样式分离,XML语法严格
两种方式对比
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>学生信息</title>
</head>
<body>
<table border="1">
<thead></thead>
<tbody>
<tr>
<th>学号</th>
<th>姓名</th>
<th>地址</th>
<th>专业</th>
</tr>
<tr>
<td>01</td>
<td>張三</td>
<td>學校</td>
<td>計算機</td>
</tr>
</tbody>
</table>
</body>
</html>
xml
<?xml version="1.0" encoding="utf-8">
<student>
<学号>01</学号>
<姓名>张三</姓名>
<地址>学校</地址>
<专业>计算机</专业>
</student>
这里属性可能还有:standalone 是否允许使用外部声明(yes/no)yes指不适用外部声明
XML 元素必须遵循以下命名规则:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “xml”(或者 XML、Xml)开始
- 名称不能包含空格
xml历史
1998年出现,背景需要把html替换掉
xml的作用:
- 可以当做小型数据库使用
- 许多软件的配置文件也通过xml保存对应的信息,列项目中数据库主机名,密码,用户名
- 许多媒体工作也通过xml文件保留用户之前看到的信息
- 可以在网站里面当接口使用
编写xml的标准
- 声明处理指令,第一行必须定义为文档声明(DTD)
- 格式:<?xml 属性列表 ?>
- 属性:
- version:版本号,必须的属性
- encoding:编码方式。文档使用的字符集,默认值ISO-8859-1
- standalone:是否独立使用,如果是yes,则表示这个XML文档是独立的,不能引用外部的DTD规范文件;如果是no,则该XML文档不是独立的,表示可以引用外部的DTD规范文档。默认为no
- 文档的树状结构:有且只有一个根节点
- 标签必须闭合
- 标签大小写一致(建议小写)
- 属性全都小写,属性必有值,值必须有引号
- 标签可以嵌套
- 特殊符号必须要是符号实体,类似这个html,不用符号实体也行使用<!CDATA[]>来表示,CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出
- 空标记闭合单标签
- xml标签名字的组合部分,可以使用汉字当标签但不建议
- 处理指令
简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容:
案列获取无广告视屏
DOM对Xml的解析处理
解析方法:DOM,DOM4J,SAX
(1)DOM(JAXP Crimson解析器)
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。要求解析器把整个XML文档装载到内存,并解析成一个Document对象,DOM以及广义的基于树的处理具有几个优点,首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改,可以进行增删改查操作。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。
(2)SAX
处理的优点非常类似于处理流的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多,缺点:只能读,逐行解析后将释放资源。
选择DOM还是选择SAX? DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
(3)DOM4J
它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能
为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。
(4)比较
- 如果不考虑可移植性,那就采用DOM4J.
- JDOM和DOM在性能表现不佳,在小文档情况下还值得考虑使用DOM和JDOM。DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
- SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
使用Dom4J的API解析XML文件
1.把整个要解析的XML文件加载到内存(Dom4J提供了一个核心类SAXReader,用来加载XML文件)
2.通过SAXReader的read()方法获取Document对象
注:SAXReader:Dom4j读取解析XML文件的api,可以将一个xml文件读取解析为Document对象。
3.通过Document对象的getRootElement()方法获取根标签
注:读取内存中的Document对啊ing,就相当于读取了xml文件的内容,document对象提供了查找根元素的方法。
4.通过根标签的attributeValue(属性名)获取根标签的属性值
5.通过根标签的elements方法获取根标签的子标签集合
6.遍历子标签集合
DOM4j的常用对象(使用之前需要导入jar包)
- SAXReader:读取xml文件到Document输结构文件对象
- Document:是一个xml文档对象树,类比html文档对象
- Element:元素节点,通过Document对象可以查找单个元素
列如:
package com.itcast.xml;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
public class Test {
public static void main(String[] args) throws IOException, DocumentException {
//获取xml的地址
// System.out.println(new File("F:\\TestXml\\books.xml").getCanonicalPath());
//xml解析
//1.获取解析器
SAXReader reader = new SAXReader();
String path = Test.class.getResource("/Application.xml").getPath();
//2.获取文档
Document document = reader.read(new FileInputStream(new File(path)));
// System.out.println(document.getNodeType());//返回文件的本身9
// System.out.println(document.getNodeTypeName());//Document
//获取根目录
Element elementRoot = document.getRootElement();
System.out.println(elementRoot);//org.dom4j.tree.DefaultElement@7cca494b [Element: <books attributes: []/>]
System.out.println(elementRoot.getName());//books
System.out.println(elementRoot.getNodeType());//1
System.out.println(elementRoot.getNodeTypeName());//Element
//获取所有子标签
List<Element> list = elementRoot.elements();
for (Element a : list){
System.out.println(a);
}
//返回三个book
/*
org.dom4j.tree.DefaultElement@7ba4f24f [Element: <book attributes: [org.dom4j.tree.DefaultAttribute@3b9a45b3 [Attribute: name id value "001"]]/>]
org.dom4j.tree.DefaultElement@7699a589 [Element: <book attributes: [org.dom4j.tree.DefaultAttribute@58372a00 [Attribute: name id value "002"]]/>]
org.dom4j.tree.DefaultElement@4dd8dc3 [Element: <book attributes: [org.dom4j.tree.DefaultAttribute@6d03e736 [Attribute: name id value "003"]]/>]
*/
}
}
XML实体引用
< :< (小于)
> :> (大于)
& :&(与)
' :'(单引号)
" :" (双引号)
PCADTA 指被解析的字符数据:
CDATA段 格式:<![CDATA[文本内容]]>
文本内用不会被解析,并且结尾']]>'不能有空格和换行。
xml节点
直接举列子:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5">
<servlet>
<servlet-name>HelloMyServlet</servlet-name>
<servlet-class>com.jourwon.HelloMyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloMyServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
节点结构:
假设想要遍历,使用迭代方法一级一级迭代,也可以使用增强foreach,这里除了这4个节点还有其他节点,自己翻阅即可符合w3c标准
入门了解一个Schema约束
- 什么是Schema约束?
Schema是新的XML文档约束;
Schema要比DTD强大很多,是DTD 替代者;
Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。
Schema 功能更强大,数据类型更完善
Schema 支持名称空间 - XML Schema 约束的作用?
定义可出现在XML文档中的元素
定义可出现在XML文档中的属性
定义哪个元素是子元素
定义子元素的次序
定义子元素的数目
定义元素是否为空,或者是否可包含文本
定义元素和属性的数据类型
定义元素和属性的默认值以及固定值
Schema与DTD一样,可以通过schema约束文档编写xml文档,常见的框架使用schema的如Spring等
<?xml version="1.0" encoding="UTF-8"?>
<!--
如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
格式如下:
<beans xmlns="http://www.hahaha.com/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.hahaha.com/bean bean-schema.xsd"
>
-->
<!--
xmlns="http://www.w3.org/2001/XMLSchema"
表示 bean-schema.xsd 中用到的元素和数据类型来自命名空间"http://www.w3.org/2001/XMLSchema"。
targetNamespace="http://www.hahaha.com/bean"
表示 当前约束文档bean-schema.xsd 在网络中的唯一标识(命名空间), 命名空间的值是唯一的,不可重复
elementFormDefault="qualified"
表示 引用bean-schema.xsd约束文档的 任何XML文档所使用的元素,必须是在此 bean-schema.xsd 中声明过的,没声明过的元素不可使用
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.hahaha.com/bean"
elementFormDefault="qualified">
<!-- 声明根标签 -->
<element name="beans">
<!-- complexType 复杂的类型,代表里面有子元素 -->
<complexType>
<!--
<choice> 规定可出现某个子元素或者可出现另外一个子元素(非此即彼):
<minOccurs> 规定某个元素能够出现的最小次数
<maxOccurs> 规定某个元素可出现的最大次数
如需使某个元素的出现次数不受限制,请使用 maxOccurs="unbounded" 这个声明
-->
<choice minOccurs="0" maxOccurs="unbounded">
<element name="bean">
<complexType>
<!-- <sequence> 规定子元素必须按照特定的顺序出现 -->
<sequence minOccurs="0" maxOccurs="unbounded">
<element name="property">
<complexType>
<attribute name="name" use="required"></attribute>
<attribute name="value" use="required"></attribute>
</complexType>
</element>
</sequence>
<attribute name="id" use="required"></attribute>
<attribute name="className" use="required"></attribute>
</complexType>
</element>
<element name="import">
<complexType>
<attribute name="resource" use="required"></attribute>
</complexType>
</element>
</choice>
</complexType>
</element>
</schema>