XML基础
Xml基本介绍
问题:什么是xml,它的作用是什么?
XML 指可扩展标记语言
所谓的可扩展标记语言,简单说就是指xml文件中的标签可以任意定义。
XML 被设计用来传输和存储数据。
问题:xml它存储的是什么样数据?
Xml中存储的是有关系的数据。
Everyday Italian
2005
Harry Potter
2005
Learning XML
2003
xm
Xml也可以形成一个树型结构,它里面每一个叫做节点,节点也分成了
元素结点(Element) 属性节点(Attribute) 文本节点(Text) 整体也是一个节点,它叫做document.
Xml在实际开发中,它的真正作用?
- 将xml做为配置文件
- 通过xml可以在不同的系统之间传递数据
Xml基本组成
首先,xml文件它的后缀名就是.xml,我们可以直接使用文本编辑器来对xml文件进行处理。
在xml文件中它有以下几部分
- 文档声明
- 属性
- 元素
- 注释
- CDATA
- PI指令(了解一下)
文档声明
它的主要作用就是说明当前文件是一个xml
文档声明有三个属性,而version encoding是常用的。还有一个属性叫做standalone它不常用。
- version 它是版本 它的值常用的是1.0
- encoding它的主要作用是声明当前xml文件的字符编码
- standalone 它的作用是描述文档是否是一个独立文档
属性
在xml文件中属性它的值必须使用引号引起来(双引号与单引号都可以)。
在实际开发中,经常会使用子标签来替换属性。
可以使用子标签来替换属性
xx
元素
元素就是指标签
在xml中所有的标签必须有结束。
格式良好的xml文件,它有且仅有一个根标签。其它所有的标签都是这个根标签的子孙元素
Xml中的元素是可以嵌套的,但是不能交叉嵌套。
在xml文件中空格换行都会被视频内容解析。
关于标签名称的规范:
- xml区分大小写 这是两个标签。
- 不能以数字或”_”(下划线)开头
- 不能以xm(Xml XML)开头
- 标签中不能包含空格
- 名称中间不能包含(:)冒号
注释
在xml文件中它的注释与html中一样
在xml文件中第一句话只能是文档声明,注释都不可以。
注释不可以嵌套。
CDATA区域
CDATA区域中的内容不会被解析,而是原样展示。
在xml中也存在一些特殊字符.
< <
> >
PI指令
Xml语法规则总结
- 所有的 xml标签必须关闭
- xml标签对大小写敏感
- xml标签必须正确嵌套
- xml文档有且只有一个根元素
- xml属性必加引号引起。
- xml中的空格会被保留,对于特殊的字符必须转义才可以使用
Xml约束介绍
在xml技术中,我们可以编写一个文档来约束一个xml文件的书写的内容规范,这个就称之为xml约束。
简单说,约束就规定了xml文件中可以写什么,不可以写什么。
为什么使用约束?
因为xml书写太随意,在对信息进行描述时,如果没有约束,我们是不知道,xml文件如果定义信息。所以必须规定xml文件中可以写什么,也就是定义其规范,这样才可以通过xml文件进行传输信息。
在xml技术中有哪些xml约束?
- DTD约束
文档类型定义(DTD)可定义合法的XML文档构建模块
Document type definition
Dtd文件后缀名就是dtd
- SCHEMA约束
Schema文件它就是一个xml文件,只不过它的文件后缀名是xsd.
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
DTD约束
Dtd约束文件的后缀名是.dtd.
Dtd快速入门
- 创建一个文件
- 创建一个dtd文件
DTD约束详解
DTD元素
格式1
格式2
在dtd中特殊符号:
? 表示对象可以出现,但是只能出现一次。
* 表示对象可以出现0次或多次
+ 表示对象可以出现1次或多次。
() 用于元素分组
| 表示在列出的对象中选择一个
,(逗号) 表示该对象必须按照指定的顺序出现。
元素类别
#PCDATA
表示元素可以包含任意字符,但是不能是子元素。
ANY
表示可以是任意的内容
EMPTY
表示元素不可以包含任何内容,只能使用属性。
DTD属性
声明属性格式
属性类型:
- CDATA 就代表当前是一个字符符
- (值1|值2|…..) 枚举类型,代表只能从其中选择一个值
- ID 值是唯一
默认值
自定义实体
语法
现在的浏览器不支持实体的外部引入,所以只能在内部声明
DTD与xml关联
- 内部关联
- 外部关联
- 关联本地文件
格式
格式
SCHEMA约束
Schema约束它是dtd替代者。Schema约束文件的后缀名是xsd
Dtd与schema区别
- dtd不遵守xml语法,而schema它遵守xml语法,它本质上就是一个xml
- dtd数据类型不完善,而schema它有丰富数据类型
- dtd只能有一个应用于xml文件,使用schema可以多个schema约束xml文件。
Schema快速入门
元素我们可以分为两种:
- 简单元素 没有属性,没有子元素
- 复杂元素 有属性或者有子元素的元素
- 编写xml文件
- 编写schema约束文件(xsd)文件
名称空间(命名空间)
我们管xsd文件叫做模式文档(约束文档),管xml文件,实例文档。
编写一个xml shcema约束文档后,通常需要将这个文件中声明的元素绑定到一个URI地址上,在xml schema技术中我们管这个过程叫做将声明的元素绑定到名称空间。以后,我们的xml文件被解析引擎解析时,可以知道我们这些xml文件中的元素来自哪里,被谁约束。
关于schema中属性
Name属性名称
Type 属性类型
Use 可取值有三个
Required 必须
Optional 是可选值
Prohibited 无属性值
Xml解析
Xml解析概述
所谓的xml解析就是对xml文件进行读写操作。
Xml解析方式分为两种:
- dom
document object model 即文档对象模型,它是w3c组织推荐的解析xml的一种方式。
- sax
simple api for xml 不是官方标准,它是xml 社区事实上的标准,几乎所有的xml解析器都支持它
dom与sax解析方式,它只一种理论,没有具体API.
Dom与sax解析方式区别
Dom:
- dom解析方式它是将整个xml文件载入内存,以树型结构来存储
- dom支持回写 可以对xml文件中内容进行crud操作
- 如果文件内容比较大,不建议使用dom解析。
Sax
- 相比dom,sax是一种更为轻量级解决方案
- 采用串行读取方式,逐行读取,读取一行解析一行。
- 编程比较复杂
- sax只能读取,不能对xml进行修改。
Xml解析包
Jaxp(sun标准)
Jdom
Dom4j(重点)
Jaxp解析
Java api for xml programming 是sun公司的一套操作xml的API.
Jaxp很好的支持了dom与sax解析方式。
Jaxp开发包是javase的一部分,它是由javax.xml org.w3c.dom oirg.xml.saq包及其子包组成
Dom解析
Dom是以层次结构组织的节点信息,在操作时,是一种树型结构,它们这些节点分为元素,属性,文本等。它们之间存在关系 parent children sibling.
Dom快速入门
步骤:
查询操作
需求:得到bookstore.xml文件中所有book的属性 category的值,并且得到book元素的子元素中的文本信息
1.得到所有的book元素可以使用 getElementsByTagName(String name),这个方法的返回值是NodelList,在NodelList中提供两个方法
2.得到book元素的属性
3.得到book下的所有子元素
getFirstChild() getLastChild()
4对子元素进行判断
getNodeType()==Node.ELEMENT
- 得到元素中的文本信息
getTextContent();
创建操作
在bookstore.xml文件中添加以下信息
- 创建元素
- 添加子元素
- 添加属性
- 添加文本
Dom回写操作
就是将在内存中对dom改变同步到xml文件中。
以下三步就可以完成dom回写操作
- 得到一个TransformerFactory对象
- 通过TransformerFactory得到一个Transformer对象
- 通过Transformer调用transform方法完成回写
修改操作
需求是将bookstore.xml文件中最后一个book元素中的
修改为 lang=”中文” 内容修改为JAVA编程思想
修改属性 setAttribute(String name,String value);
修改文本 setTextContent(String value);
删除操作
将bookstore.xml文件中最后一个book元素的属性category删除。
删除属性 removeAttribute(String name);
删除子元素 removeChild(Node childNode)
获取父元素操作
getParentNode()来完成。
Sax解析
Sax是基于事件驱动的方式来对xml进行处理。
Sax它只能进行读操作。它是读取一行解析一行。
Sax解析操作步骤:
- 得到一个SAXParseFactory解析器工厂
- 通过解析器工厂得到一个解析器对象SAXParse
- 通过解析器对象得到一个xml的读取器
- 给读取器一个时间处理器,读到了那里,我需要做什么操作,我得知道
- 解析xml文件
package cn.itcast.sax;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
//解析bookstore1.xml文件
public class SaxDemo {
public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException {
// 1. 得到一个SAXParseFactory解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2. 通过解析器工厂得到一个解析器对象SAXParse
SAXParser parse = factory.newSAXParser();
// 3. 通过解析器对象得到一个xml的读取器
XMLReader xmlReader = parse.getXMLReader();
// 必须组读取器设置一个事件处理器
xmlReader.setContentHandler(new DefaultHandler() {
// 开始解析整个文档
@Override
public void startDocument() throws SAXException {
System.out.println("开始解析xml文件");
}
// 开始解析某一个元素
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
String element = ("<" + qName+" ");
if (attributes.getLength() > 0) { // 判断有属性
element += attributes.getQName(0) + "="
+ attributes.getValue(0);
}
element += ">";
System.out.println(element);
}
// 开始解析文本
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String text = new String(ch, start, length);
if (text != null && text.trim().length() > 0) {
System.out.println("文本信息:" + text);
}
}
// 解析元素结束
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("" + qName + ">");
}
// 解析整个文档结束
@Override
public void endDocument() throws SAXException {
System.out.println("结束解析xml文件");
}
});
// 4. 解析xml文件
xmlReader.parse("WebRoot/bookstore1.xml");
}
}
DOM4J
Dom4j介绍
Dom4j是一个简单灵活开放源代码的操作xml类库。
Dom4j它是一个优秀操作xml的工具,在很开源的框架中大量使用dom4j,例如
Struts2 hibernate sping框架。
要想使用dom4j必须下载dom4j jar包才可以使用。
Dom4j快速入门
- 导入jar包
如果你的工程是web project 直接将jar包复制到WebRoot下的WEB-INF下的lib目录下。
如果你的工程是java project ,手动创建一个lib目录,将jar复制到目录下,右键add builder path.
- 编写代码
Dom4j进行CRUD操作
查询操作
需求:查询出当前的bookstore.xml文件中所有book元素,并得到book元素的所有属性category的值,并且要求得到book元素下的author子元素中的文本信息。
1.获取根元素 getRootElement()
2..获取子元素
elements() 获取所有子元素 返回是List集合
elements(String name) 获取所有指定名称子元素,返回的是List集合.
- 获取元素的属性值
Element.attribute(String name)得到一个Attribute对象,通过Attribute调用它的getValues()方法得到属性值,也可以简化成
Element.attributeValue(String name);来得到属性值。
- 获取元素下某一个指定的子元素
element(String name),返回的就是指定名称的子元素
- 获取元素中的文本信息
Element.getText()返回的就是元素中的文本信息
如果我们想要直接得到某一个子元素的文本信息,可以直接
Element.elementText(String name);
创建操作
需求:向bookstore.xml文件中最后一个book内添加以下内容
- 创建元素
DocumentHelper.createElement(String name)
返回的就是一个Element对象。
- 添加属性
addAttribute(String name,String )
- 添加文本
setText(String value)
在dom4j中可以在String与Document之间做相互转换
dom4j回写
修改操作
修改属性
addAttribute();属性不存在,执行添加,属性存在,执行修改
修改元素的文本信息
setText();
删除操作
删除属性
Element.remove(Attribute att)
参数可以通过Element.attribute(String name)来获取,完成删除操作
可以通过dom4j的API,来删除元素,但是必须通过父元素调用remove方法来删除。
我们也可以通过List集合提供的remove方法来删除。