学习目录
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:
<?xmlversion="1.0"standalone="no"?>
<!--必须名字都一样g-->
<!--这是一个内部调用DTD的方法-->
<!DOCTYPEg[
<!ELEMENTg(#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);
}
}