学习目录
XML
简介
:
1.
什么是
XML?
有什么作用
?
2.
XML
的背景
3.
XML
与
HTML
的关系
4.
XML
文档的结构
5.
XML
良好的格式规范是什么
?
6.
XML
的语法
(
如何书写一个
XML
文档
)
7.
XML
的字符转义
8.
引用
DTD:
1.
什么是
DTD?
有什么用
?
2.
在
XML
文档中调用
DTD
3.
DTD
的结构
4.
定义元素
5.
定义子元素
6.
定义属性
7.
实体声明
名域空间
:
1.
什么是名域空间
?
有什么用
?
解析器
:
1.
什么是解析器
?
有什么用
?
2.
JAVA
中解析
XML
文档
(XML
有四种解析方式
)
1)
Dom
2)
Sax
3)
Jdom
4)
Jadp
XML
简介
:
什么是
XML?
有什么作用
?
是一种元标记语言
,
可以定义新的标记
,
和
HTML
比较相似
,
但是更强大
基本作用是用来交换数据的
,
我们可以把它当作是一个文本数据库
,
也可以用做配置文件等
XML
背景
:
1) XML
代表扩展的标记语言
(eXtensible Markup Language);
2) XML
由
W3C
联盟发展维护
;
3) XML
是一种元语言,可以用来定义其它标签语言
;
4) XML
没有定义任何标记,它提供了一种工具定义标记以及它们之间的结构关系
;
5) XML
是一种用于结构化文本交换的标记语言
;
6) XML
代表了内容的结构也代表了内容本身
;
7) XML
继承自
SGML(
标准标记语言
)
。
SGML
的前身
GML
由
IBM
在
1960
年发明,用于描述设备无关的文本
8) XML
是
SGML
的子语言
,
由
SGML
简化而来,起初目的是为
Web
的结构文档提供服务。
9) W3C
组织在
1998
年
2
月
10
日发布
XML1.0
版,第二个版本发布于
2000
年
10
月
9
日。
10)XML
是分层的树形结构的自解释的一种可扩展的标记语言。
XML
与
HTML
的关系
:
事实上,
HTML
和
XML
不能够进行比较的。因为
XML
是一种元语言,而
HTML
是一种定义好的标记语言。
XML
是描述数据的语言,
HTML
是描是数据外观的语言。
HTML
有一套确定的标记。在
W3C
标准规范中定义了
HTML
标记的含义并由部分浏览器实现了。
HTML
标记非常适合描述人类易读的可视化文本。
HTML
定义了许多表现指令用以优化在浏览器中的显示。
在
HTML
标记中,数据固有的结构丢失了。
HTML
没有维持数据类型信息的完整性、约束、或实体间的其它关系,而
XML
提供了这些特征。
XML
文档的结构
:
XML
文档
=
序言
+
元素
+
杂项(可选)
1
)序言
序言
=
(
XML
声明)
+
(杂项)
+
(文档类型声明)
XML
声明
<? xml
版本信息
(
编码信息
) (
文档独立性信息
) ?>
如:
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
文档类型声明
规定元素的结构和属性列表的取值
如:
<!DOCTYPE studinfo SYSTEM "studinfo.dtd">
2
)元素
空元素
<
空元素标签名
属性
="
属性值
"/>
非空元素
<
起始标签
>
内容
<
结束标签
>
内容
=(
子元素
|
字符数据
|
字符数据段
|
引用
|
处理指令
|
注释
)*
字符数据
字符数据中,不能含有
&,<,>,',",
需要采用实体引用的方式
字符数据段
<![CDATA[
字符数据
]]>
引用
<!ENTITY
引用名
".......">
3
)杂项
处理指令
XML
为其它应用程序准备的接口。
<?
处理指令
?>
注释
<!--
注释内容
-->
空白符指空格、回车等
例子
:
<?xml verson="1.0"?><!--
这一句一定要求写在文件的第一行
-->
<!--
只能有一个根元素即那一对根标签
-->
<root><!--
根标签
-->
<!--
根元素的内容
-->
<leaf><!--
子元素
-->
...
<leaf>
</root>
XML
良好的格式规范是什么
?
1)
文档声明位于文件的开头
<?xml version="1.0"?>
2)
文档中只能定义一个唯一的根元素(根元素是在文档声明之后的最外层的元素)
3)
标签必须闭合,且不能交叉,有元素的起始标签,就必须有其结束标签(空元素除外)
4)
层层嵌套,每一对标签总是出于另一对标签的内或和其处于同一层,不能交叉(根元素
chuw
)
5)
大小写敏感,起始标签和结束标签的名字要一致
6)
属性值必须用引号引起来
7)
注意特殊字符,使用时需要使用转义字符。
注意:
1.
第一行一定要写
<?xml version="1.0"?>
2.xml
文件是由元素和元素的内容以及属性组成的,一个
xml
文件中只能有一个根元素,标签和标签的内容加在一起叫作一个元素。
xml
是大小写敏感的,只能以字母或下划线开头。
XML
的语法
(
如何书写一个
XML
文档
)
XML
文档是由标签和标签的内容组成的
,
把这个组合称为元素
非空元素
<test>(
起始标签
)
aaa(
内容
)
</test>(
结束标签
)
空元素
<test values="test"/>
XML
的字符转义
:
字符转义是什么
?
就是用一个字符代表一种意义
如
:
<
代表
"<" ,>
代表
">" ,"
代表双引号。
&
代表
"&" ,'
代表单引号
<!CDATA[........]>
....
的部分不必使用转义,其中内容会直接输出。
引用
:
实体声明
<!ENTITY
引用名
"......">
使用实体
,
引用
&
引用名
例子
:
<?xml version="1.0" encoding="gb2312"?>
(
XML
文件的声明)
<!--this is a comment hehe-->
(注释)
<student>
(根元素)
<script>
(子元素)
<![CDATA[function compare(a,b){
if(a>b)
then {return 1}
else{return 0}
}]]>
</script>
<script value="java"/>
(空元素)
<name country="china"
(属性名
=
“属性值”)
>
张三
</name>
</student>
XSLT,
是用于对
XML
进行文档格式转换,把一个
XML
文档转换成另一种格式的
XML
文档,但是其中内容是不变的。
DTD
什么是
DTD?
有什么用
?
文档类型的定义
,
可以定义元素等
在
XML
文档中调用
DTD:
两种方法
:
第一种
,
内部调用一个
DTD:
<?xml
version=
"1.0"
standalone=
"no"
?>
<!--
必须名字都一样
g-->
<!--
这是一个内部调用
DTD
的方法
-->
<!DOCTYPE
g[
<!ELEMENT
g
(#PCDATA)>
]>
<g>
</g>
注意
:
studinfo
与
(#PCDATA)
有空格
文档类型名与根元素名必须一致
第二种
,
外部调用一个
DTD
文件
注意点:
(
1
)
standalone="no"
(
2
)注意
dtd
文件的路径
DTD
的结构
1.
元素类型声明
:
指明元素的名字和内容
<!ELEMENT
元素名字
(
元素内容
)>
元素内容
=EMPTY || ANY ||
元素内容
|| #PCDATA
#PCDATA:
可解析的字符数据
元素内容
:
指定的子元素
EMPTY:
代表空元素
ANY:
任何都可以
元素的出现次数可以选
:
*
零次或多次
+
一次或多次
?
零次或一次
|
可选
2.
属性声明
属性:由
“=”
分隔的成对的属性名和属性值构成,只能出现在元素标记的内部。结束标记不能带属性,一个元素可以具有多个属性
<!ATTLIST
对应的元素名
属性名
属性取值类型
属性默认值
>
属性取值类型
1
、
CDATA
:可析字符
2
、
Enumerated:
枚举类型,由
“|”
分隔的可能的属性值列表
3
、
Entity:
实体
4
、
ID
属性值
:
属性值不能重复
属性默认值:
注意
1
、
#REQUIRED:
必须提供属性值
2
、
IMPLIED
:可提供也可不提供
3. FIXED:
不能修改
3.
实体声明
<!ENTITY
实体名字
“hello world!”>
&
实体名字
名域空间
:
什么是名域空间
?
干什么用的
?
解决
XML
文档中命名冲突的问题,即将
XML
文档与引用
URI
标识的名域相结合,来限定其中的元素和属性名
名域的声明
:
1.
直接定义
类比
:
名字和身份证
语法
:xmlns:
名域前缀
=”url”(
唯一性
)
2.
缺省声明
xmlns=”url”
名域的使用
:
1.
用名域限定元素
2.
用名域限定属性
解析器
:
什么是解析器
?
有什么用
?
1.
读取
XML
文档
2.
如果有
DTD,
也拿过来读
,
分析
XML
的结构内容并进行处理
(
从
XML
文档中得到信息
)
3.
验证
XML
是否格式良好有效
JAVA
中解析
XML
文档
(XML
有四种解析方式
)
在
java
中如何解析一个
xml
文档呢
?
先看看
xml
的解析方式
xml
有四种解析方式
:
1.
Dom:
文档对象模型
2.
SAX:
事件机制驱动
3.
Jdom
4.
JADP
SAX:
基于事件处理模型
,
在读取
XML
文件时会触发相应的事件
,
这些事件被预先注册的事件处理器来处理
优点
:
速度快
,
占用的资源少
,
边读边解析
,
适合要求快速处理
XML
文档的场合
,
如
:Applet
等
缺点
:
不能前后遍历
,
不能增删改
/**
*
知识点
:
* SAX
解析方式来解析
XML
文档
*
程序目标
:
* java
文件
:
* MyContentHander.java:
监听器类
(SAX
解析方式是基于事件处理的方式
)
*
在
java
中解析一个
XML
文档
,
将里面的元素读取出来打印到终端上
*
要求使用
SAX
解析方式
*
流程
:
* 1.
得到工厂对象
* 2.
使用工厂对象创建
SAXParser
* 3.
使用
SAXParser
对象得到一个
XMLReader
对象
,
这个对象可以解析
XML
文档
* 4.
为
XMLReader
对象注册监听器
* 5.
使用
XMLReader
对象的
parse()
方法执行
XML
文件进行解析
*/
package MY.SAX;
import java.io.IOException;
import javax.xml.parsers.*;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
public class SAXTest {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
// TODO Auto-generated method stub
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser sp=factory.newSAXParser();
XMLReader xr=sp.getXMLReader();
InputSource is=new InputSource(new String("student.xml"));
xr.setContentHandler(new MyContentHander());
xr.parse(is);
// xr.parse("student.xml");
}
}
package MY.SAX;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MyContentHander extends DefaultHandler{
@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
// TODO Auto-generated method stub
System.out.println(new String(arg0,arg1,arg2));
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("end");
}
@Override
public void endElement(String arg0, String arg1, String arg2) throws SAXException {
// TODO Auto-generated method stub
System.out.println(arg1);
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("start");
}
@Override
public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
// TODO Auto-generated method stub
System.out.println(arg1);
}
}
DOM:
文档对象模型
将整个
XML
文件读到内存中
,
然后转化为一棵由各种节点组成的树
优点
:
可以前后遍历
XML,
也可以增删改任意的节点
缺点
:
占用的资源多
,
速度慢
,
不适合处理大型的
XML
文档
/**
*
知识点
:
* DOM
解析方式解析一个
XML
文件
*
程序目标
:
*
将
XML
文件中的元素属性全部打印出来
*/
package MY.DOM;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
public class DomTest {
public static void test(Node start){
System.out.println("nodeName:"+start.getNodeName()
+" nodeValue:"+start.getNodeValue());
for(Node child = start.getFirstChild();
child!=null;child = child.getNextSibling()){
test(child);
}
}
public static void test2(Node start){
System.out.println("NodeName:"+start.getNodeName()
+" nodeValue:"+start.getNodeValue());
if(start.getNodeType()==Node.ELEMENT_NODE){
NamedNodeMap nnm=start.getAttributes();
for(int i=0;i<nnm.getLength();i++){
Node node=nnm.item(i);
System.out.println("attName:"+node.getNodeName()
+"attValue:"+node.getNodeValue());
}
}
for(Node child = start.getFirstChild();
child!=null;child = child.getNextSibling()){
test2(child);
}
}
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
// TODO Auto-generated method stub
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=dbf.newDocumentBuilder();
Document doc=builder.parse("student.xml");
Element e=doc.getDocumentElement();
test2(e);
}
}