一、XML入门
HTML:负责网页的结构
CSS:负责网页的样式(美观)
JavaScript:负责在浏览器端与用户进行交互
HTML语言特点:(1)由标签组成;(2)语法结构松散,不区分大小写,结束标签和开始标签不一定匹配。
HTML与XML的区别:
(1) HTML(HyperTextMarkup Language)超文本标记语言,由标签组成,标签是由w3c组织制定,固定的;作用是负责网页结构的。
(2) XML(ExtendMarkup language)可扩展标签语言,标签由开发者按照一定的语法定义自己制定的,作用是描述带关系的数据(作为软件的配置文件)和作为数据的载体(存储数据,小型的”数据库”)
二、XML语法:
xml文件以xml后缀名结尾。
xml文件需要使用xml解析器去解析。浏览器内置了xml解析器
三、标签
3.1语法:
<student></student>开始标签 标签体内容 结束标签
(1)<student/>或<student><student/>空标签。没有标签体内容
(2)xml标签名称区分大小写
(3)xml标签一定要正确配对
(4)xml标签名中间不能使用空格
(5)xml标签名不能以数字开头
(6)注意:在一个xml文档中,有且仅有一个根标签
3.2属性
语法:<Studentname=”eric”>student</Student>
注意:
(1) 属性值必须以引号包含,不能省略,也不能单双引号混用!!!
(2) 一个标签内可以有多个属性,但不能出现重复的属性名!!!
3.3注释
语法:<!--注释的内容 -->
3.4文档声明
语法:<?xmlversion=”1.0” encoding=”utf-8”?>
version:xml的版本号
encoding:解析xml文件时查询的码表(解码过程时查询的码表)
注意:
如果在ecplise工具中开发xml文件,保存xml文件时自动按照文档声明的encoding来保存文档
3.5转义字符
在xml中内置了一些特殊字符,这些特殊字符不能直接被浏览器原样输出。如果希望把这些特殊字符按照原样输出到浏览器,对这些特殊字符进行转义。转义之后的字符就叫转义字符
特殊字符 转义字符
< <
> >
“ "
& &
空格
3.6 CDATA块
作用:可以让一些需要进行包含特殊字符的内容统一进行原样输出
<![CDATA[
<html><head>head</head><body>body</body></html>
]]>
3.7处理指令
作用:告诉xml解析器如何解析xml文档
案例:<?xml-stylesheettype=”text/css” href=”1.css”?>告诉xml解析器该xml文档引用了哪个css文件
需要提取xml内容可以使用xml-stylesheet指令
四、xml解析
4.1 引入
xml文件除了给开发者看,更多的情况是程序读取xml文件的内容。这叫做xml解析
4.2 xml解析方式(原理不同)
DOM解析
SAX解析
4.3 xml解析工具
DOM解析原理:
(1)JAXP (oracle-Sun公司官方)
(2)JDOM工具(非官方)
(3)Dom4J工具(非官方)
三大框架(默认读取xml的工具就是Dom4J)
SAX解析原理:
(1) SAX解析工具(oracle-Sun公司官方)
/*
BOM(浏览器对象编程)
DOM(文档对象编程)JavaScript引擎把html文件中标签封装成各种对象
*/
xml解析器在解析xml文档时,把xml文件的各个部分内容封装成对象,通过这些对象操作xml文档,这种做法叫做DOM解析(DOM编程)
Dom解析:
Document对象,代表一个完整的xml文档
通过Document对象可以得到其下面的其他节点对象,通过节点对象访问xml文档的内容。(标签,属性,文本,注释…)
4.4什么是DOM解析
DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一棵Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容
4.5 Dom4J工具
非官方,不在JDK内
使用步骤:
(1) 导入dom4j的核心包 dom4j-1.6.1.jar
(2) 编写Dom4J读取xml文件代码
public static void main(String[] args) {
try {
//1、创建一个xml解析器对象
SAXReader reader = new SAXReader();
//2、读取xml文档,返回Document对象
Document document = reader.read(new File("./src/contact.xml"));
System.out.println(document);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
4.6Dom4j读取xml文件
节点:
Iterator Element.nodeIterator(); //获取当前标签节点下的所有子节点
标签:
Element Document.getRootElement(); //获取xml文档的根标签
Element Element.element(“标签名”);//指定名称的第一个子标签
Iterator<Element>Element.elementIterator(“标签名”);//指定名称的所有子标签
List<Element> Element.elements();//获取所有的子标签
属性:
String Element.attributeValue(“属性名”);//获取指定名称的属性值
Attribute Element.attribute(“属性名”);//获取指定名称的属性对象
Attribute.getName();//获取属性名称
Attribute.getValue();//获取属性值
List<Attribute>Element.attributes();//获取所有属性对象
Iterator<Attribute> Element.attributeIterator();//获取所有属性对象
文本:
Element.getText();//获取当前标签的文本
Element.elementText(“标签名”);//获取当前标签的指定名称的子标签的文本内容
五、总结:
5.1 xml作用
a) 作为软件配置文件(最常见)
b) 作为小型的”数据库”
5.2 xml语法(由w3c组织规定的)
标签:
标签名不能以数字开头,中间不能由空格,区分大小写,有且仅有一个根标签
属性:
可以有多个属性,但是属性值必须用引号(单引号或双引号)包含,但不能省略,也不能单双混用
文档声明:
<?xmlversion=”1.0” encoding=”utf-8”?>
Encoding=”utf-8”: 打开或解析xml文档时的编码
注意:
保存xml文档时的编码和解析xml文档时的编码要保持一致,才能避免中文乱码问题!
5.3 xml解析(DOM解析)
程序读取或操作xml文档
两种解析方式:DOM解析 VS SAX解析
DOM解析原理:一次性把xml文档加载成Document树,通过Document对象得到节点对象,通过节点对象访问xml文档内容(标签,属性,文本,注释)。
5.4 Dom4j工具(基于DOM解析原理):
读取xml文档:
Document doc =new SAXReader().read(“xml文档”);
节点:
nodeIterator(); //所有节点
标签:
Element(“名称”); //指定名称的第一个子标签对象
elementIterator(“名称”); //指定名称的所有子标签对象
elements(); //所有子标签对象
属性:
attributeValue(“名称”); //指定名称的属性值
attribute(“名称”); //指定名称的属性对象
getName() //属性名称
getValue() //属性值
attributeIterator() //所有属性对象(Iterator)
attributes() //所有属性对象(List)
文本:
getText() //得到文本
elementText(“子标签名称”) //得到字标签的文本
day0709
六、Dom4j修改xml文档
XMLWriterwriter = new XMLWriter(OutputStream,OutputFormat);
Writer.write(Document);
6.1修改xml文档的API
增加:
DocumentHelper.createDocument(); //增加文档
addElement(“名称”); //增加标签
addAttribute(“名称”,”值”); //增加属性
修改:
Attribute.setValue(“值”); //修改属性值
Element.addAttribute(“同名的属性名”,”值”);//修改同名的属性值
Element.setText(“内容”); //修改文本内容
删除:
Element.detach(); //删除标签
Attribute.detach(); //删除属性
七、xPath技术
7.1引入:
当使用Dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦
7.2 xPath作用
主要用于快速获取所需的节点对象
7.3在dom4j中如何使用xPath技术
(1)导如xPath支持jar包。Jaxen-1.1-beta-6.jar
(2)使用xPath方法
List<Node> selectNodes(“xPath的表达式”); //查询多个节点对象
Node selectSingleNode(“xPath的表达式”); //查询一个节点对象
7.3 xPath语法
/ 绝对路径 表示从xml的根位置开始或子元素(一个层次结构)
// 相对路径 表示不分任何层次结构的选择元素
* 通配符 表示匹配所有元素
[] 条件 表示选择什么条件下的元素
@ 属性 表示选择属性节点
and 关系 表示条件的与关系(等价于&&)
text() 文本 表示选择文本内容
案例:
用户登录功能:
用户输入用户名和密码--à到”数据库”查询是否有对应的用户--à
有:则表示登录成功
没有:则表示登录失败
用xml当做数据库
user.xml 用来存储用户的数据
八、SAX解析
8.1 引入
DOM解析原理:一次性把xml文档加载进内存中,然后在内存中构建Document树。对内存要求比较高
缺点:不适合去读取一些大容量的文件,容易导致内存溢出。
SAX解析原理:加载一点,读取一点,处理一点,对内存的要求比较低。
8.2 SAX解析工具:
SAX解析工具:Sun公司提供的,内置在jdk中。org.xml.sax.*
核心的API:
SAXParse类:用于读取和解析xml文件
parse(Filef,DefaultHandler dh);//方法,解析xml文件
参数一:File:表示读取的xml文件
参数二:DefaultHandler:SAX事件处理程序。使用DefaultHandler的子类
DefaultHandler类的API:
void startDocument() : 在读到文档开始时调用
void endDocument() : 在读到文档结束时调用
void startElement(String uri,String localName,StringqName,Attributes attributes) : 读到开始标签时调用。
void endElement(String uri,String localName,String qName) : 读到结束标签时调用
void characters(char[] ch,int start,int length) : 读到文本内容时调用
DOM解析 VS SAX解析
区别一:
DOM解析原理:一次性加载xml文档,不适合大容量的文件读取
SAX解析原理:加载一点,读取一点,处理一旦,适合大容量文档的读取
区别二:
DOM解析可以任意进行增删改查
SAX解析只能读取
区别三:
DOM解析任意读取任何位置的数据,甚至往回读
SAX解析只能从上往下,按顺序读取,不能往回走
区别四:
DOM解析面向对象的编程方式(Node,Element,Attribute)Java开发者编码比较简单
SAX解析基于事件的编程方法。Java开发者比较难理解
九、总结:
9.1 Dom4j修改xml文档
写出xml文档
XMLWriter writer = new XMLWriter();
Writer.write(doc); //写出xml文档
增加:
DocumentHelper.createDocument(); //增加新文档
Element.addElement(“name”); //增加子标签
Element.addAttribute(“name”,”value”) //增加属性
修改:
Attribute.setValue(“value”); //修改属性值
Element.setText(“value”); //修改文本内容
删除:
Element.detach(); //删除标签
Attribute.detach(); //删除属性
9.2 xPath技术:快速找到xml(标签,属性,文本)
dom4j使用xpath:
List<node>list = Element.selectNodes(“xpath表达式”); //多个节点对象
Nodenode = Element.selectSingleNode(“xpath表达式”); //一个节点对象
9.3 xpath表达式语言
/ 表示根位置或者 子标签
// 表示后代标签(部分层次结构)
* 表示所有元素
[] 表示条件
@ 表示选择属性
text() 表示选择文本
and 表示与条件
9.3 SAX解析:原理:加载一点,解析一旦,处理一点,对内存要求不高(基于事件)
SAXParser类:
parser(Filefile,DefaultHandler handler): 该方法使用SAX解析方式去解析xml文档
DefaultHandler类:重写该类中的一些方法,用于处理xml文档
startElement(…String qName); //读到开始标签时调用
characters(char[] ch, int start,intlength); 读到文本内容时调用(包括空格和换行)
endElement(….String qName); //读到结束标签时调用
十、xml约束
xml约束要求:大家能够看懂约束内容,根据约束内容写出符合规则的xml文件
xml语法:规范的xml文件的基本编写规则(由w3c组织制定的)
xml约束:规范xml文件数据内容格式的编写规则(由开发者自行定义)
10.1 xml约束技术:
DTD约束:语法相对简单,功能相对简单。学习成本低
Schema约束:语法相对复杂,功能也相对强大。学习成本相对高。(语法空间)
10.2 DTD约束:
导入dtd方式
内部导入
<!DOCTYPE note [
<!ELEMENTnote (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENTbody (#PCDATA)>
]>
外部导入
本地文件系统:
<!DOCTYPE note SYSTEM “note.dtd”>
公共的外部导入:
<!DOCTYPE 根元素 PBULIC http://gz.itcast.cn/itcast.dtd>
DTD语法
约束标签
<!ELEMENT 元素名称 类别> 或 <!ELEMENT元素名称 (元素内容)>
类别:
空标签:EMPTY 表示元素一定是空标签
普通字符串:(#PCDATA)。表示元素的内容一定是普通字符串(不能含有子标签)
任何内容:ANY。 表示元素的内容可以是任意内容
(元素内容):
顺序问题:
<!ELEMENT 元素名称(子元素名称1,子元素名称2,……)> :按顺序出现子标签
次数问题:
标签:必须且只出现1次
标签+:至少出现一次
标签*:0或n次
标签?:0或1次
约束属性
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
默认值:
#REQUIRED 属性是必需的
#IMPLIED 属性不是必需的
#FIXEDvalue 属性不是必需的,但属性值是固定的
属性类型:控制属性值
CDATA :表示普通的字符串
(en1|en2|…):表示一定是任选其中的一个值
ID: 表示在一个xml文档中该属性值必须唯一,值不能以数字开头
10.3 XML Schema 也是一种用于定义和描述xml文档结构与内容的模式语言,其出现是为了克服DTD的局限性
名称空间:告诉xml文档的哪个元素被哪个schema文档约束。在一个xml文档中,不同的标签可以受到不同schema文档约束
1、 一个名称空间受到schema文档约束的情况
2、 多个名称空间受到多个schema文档约束的情况
3、 默认名称空间的情况
4、 没有名称空间的情况