* XML(*****)
* XML的简介
* XML 可扩展的标记语言。(和HTML非常类似的)
* 可扩展的。
* 自定义的标签。
* XML传输数据,HTML是显示数据。
* XML的版本: XML1.0(使用该版本) XML1.1(不向下兼容)
* 做什么用?
* 描述有关系的数据
* 应用
* 作为配置文件。
* 可以在系统与系统之间进行数据的传输。
* webserivice soap XML封装数据
* json 和XML概念
* XML的语法
* 文档声明(*****)
* 写法: <?xml version="1.0" ?>
* 文档声明必须出现在xml文件的第一行和第一列的位置。
* 属性:
* version="1.0" XML的版本 (必须写)
* encoding="UTF-8" 编码集 (可选的)
* standalone="yes或者no" 代表xml的文件是否是独立的。(如果是no,不独立,可以引入外部的文件)(可选的)
* 因为不写该属性,可以引入外部的文件。
* 乱码会伴随你们一生?
* 产生的原因:保存文件时和打开文件时采用的编码不一致。
* 解决办法:保存文件可打开文件采用的编码一致就ok。(MyEclipse不会产生乱码问题)
* 元素(***)
* 开始标签和结束标签。
* 包含标签主体: <abc>文本</abc>
* 不包含标签主体: <abc/>
* 不能交叉嵌套
* 只能有一个根元素(必须有,并且只能有一个)
* 命名规范:
* 区分大小写 错误的:<a></A> 代表两个标签
* 不能以数字和-中划线开头 错误的:<1a> <-a>
* 不能以XML(Xml XML xml)开头 错误的:<xmlaa>
* 不能包含空格和冒号。
* 属性(***)
* 自定义:命名规范同上。
* 在同一个元素上,不能有相同的属性。(*****)
* 可以使用双引号或者单引号。
* 注释(*)
* 和HTML的注释相同
<!-- XML的注释 -->
* 注释不能嵌套。
* 特殊字符
* < <
* > >
* & &
* " "
* ' '
* CDATA区
* 把标签中的内容作为字符串。
* 语法:
<![CDATA[
内容:当成字符串
]]>
* PI(处理指令)
* 替换HTML
* XML的约束
* DTD
* schema
<myspring>
<bean>hello.java</bean>
<猫/>
</myspring>
* 格式良好的XML:遵循语法规范。
* 有效的XML:有约束。
* DTD的约束
* 快速入门
* 快速入门的步骤:
* 需要出现哪些标签?
* 在DTD的文件中编写元素
<!ELEMENT 元素名称 元素类型>
* 判断元素是否是复杂还是简单元素?
* 如果是简单元素:(#PCDATA) 代表是字符串
* 如果是复杂元素:(子节点)
* 需要在book.xml引入DTD的文件
* <!DOCTYPE 根节点 SYSTEM "DTD文件的地址">
* DTD与XML文档的关联方式
* 可以在XML的文件中直接书写DTD的代码。(经常使用)
<!DOCTYPE 根节点 [
DTD的代码
]>
* 引入本地的DTD文件(经常使用)
<!DOCTYPE 根节点 SYSTEM "DTD文件的地址">
* 引入网络上的DTD文件
<!DOCTYPE 根节点 PUBLIC "DTD文件名称" "DTD文件的地址">
* 元素定义
* 语法:<!ELEMENT 元素名称 元素类型>
* (#PCDATA) 字符串
* EMPTY 空
* ANY 任意的
* (子元素)
* 子元素:
* 子元素之间的关系
* , 子元素出现是有顺序的
* | 子元素只能出现一个
* 子元素出现的次数
* + 子元素出现1次或多次
* * 子元素出现0次或多次
* ? 子元素出现0次或1次
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
<MYFILE>
<TITLE></TITLE>
<AUTHOR></AUTHOR>
<EMAIL></EMAIL>
<TITLE></TITLE>
<AUTHOR></AUTHOR>
<EMAIL></EMAIL>
<TITLE></TITLE>
<AUTHOR></AUTHOR>
<EMAIL></EMAIL>
</MYFILE>
* 属性定义(AttributeList)
* 写法: <!ATTLIST 元素名称
属性名称 属性类型 属性约束
属性名称 属性类型 属性约束
>
* 属性类型
* CDATA 字符串
* 枚举(没有提供关键字) (男人|女人)
* ID 代表唯一的值,不能只写数字
* 属性的约束
* #REQUIRED 必须出现的
* #IMPLIED 可选的
* #FIXED 固定值 #FIXED "值"
* 默认值(不用)
* 实体定义(用的不多)
* <!ENTITY 别名 "值" >
* 需要在xml中引入别名,浏览器打开文件后,在引入的位置上显示值的。
XML解析方式有两种:dom和sax
document object model,文档对象模型。是W3C推荐处理XML的一种方式。
simple API for XML,不是官方标准,属于开源社区XML-DEV,但是几乎所有XML解析器都支持它。
XML解析开发包
JAXP是SUN公司推出的解析标准实现。
DOM4J是开源组织推出的解析开发包。
JDOM是开源组织推出的解析开发包。
* 解析XML
* 解析XML的方式有哪些呢?
* 常用的有两种?DOM和SAX
* 区别:
DOM解析XML
* 在内存中形成树状结构
* 缺点:如果文档过大,容易产生内存溢出的问题。
* 优点:方便做增删改的操作
SAX解析
* 基于事件驱动,边读边解析
* 优点:不会产生内存溢出问题。
* 缺点:不能做增删改操作。(DOM4J在内存生成树状结构)
*,只能使用DOM方式,如果SAX,只能做查询。
* DOM4J(*****) JAXP SUN提供的
* 想做增删改 企业都在用。DOM4J提供的
* 全部都可以做。
* JDOM(不讲了)
JAXP:(Java API for XML Processing)开发包是JavaSE的一部分,它由以下几个包及其子包组成:
org.w3c.dom:提供DOM方式解析XML的标准接口
org.xml.sax:提供SAX方式解析XML的标准接口
javax.xml:提供了解析XML文档的类
* DOM
* DocumentBuilderFactory :解析器工厂类
* DocumentBuilder 获取解析器对象
* 解析XML(Document parse(String uri) )
// 获取解析器工厂类
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获取解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML的文档,返回document对象
Document document = builder.parse("src/book2.xml");
* 回写
* 获取回写的工厂类
* 获取回写对象
* 调用回写的方法进行回写。
// 创建回写类的工厂
TransformerFactory transformerFactory = TransformerFactory.newInstance();
// 获取回写类
Transformer transformer = transformerFactory.newTransformer();
// 调用回写的方法
transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));
* XML的约束(schema,看懂)
* schema约束:
* schema和DTD的对比(面试题):
* schema符合XML的语法结构。
* 可以解析schema文档。
* schema对名称空间支持的好。
* schem支持更多的数据类型,自定义的数据类型。
* 预先定义元素和属性
* schema的后缀名是.xsd
* 只能有一个根节点,名称是schema。
* 开发步骤
* 开发schema的约束文档
* 引入W3C的名称
* 在根节点上,使用属性xmlns(xml namespace)
* xmlns="http://www.w3.org/2001/XMLSchema"
* 定义元素
* <element name="书架"></element>
* 判断是否是复杂还是简单的元素
* 如果是简单 在element有属性 type="数据的类型"
* 如果是复杂
* 声明标签是复杂的元素 <complexType>
* 子元素之间的关系 <sequence>
* 起名:targetNamespace 目标名称空间(起名)
* 值是任意的:http://www.itcast.cn/1110
* elementFormDefault :
* qualified(使用) :质量好的
* unqualified :质量不好的
* 在XML文档中引入自己编写的schema文档
* 引入W3C名称空间,我是实例文档。
* xmlns="http://www.w3.org/2001/XMLSchema-instance"
* 引入自己编写的schema的文档
* xmlns="http://www.itcast.cn/1110"
* 问题:元素上不能有相同的属性名称
* 解决:起别名 :aa
* 技巧:在下面出现标签的概率小起别名
* 引入自己编写的schema文档的地址
* schemaLocation属性是W3C提供的,如果W3C名称空间要是有别名的话,先把别名写上。
xsi:schemaLocation="名称空间 schema文件的地址"
* 名称空间的概念
* 编写完schema文档,起唯一的名称空间。
* 在编写XML文档,通过xmlns来引入名称空间。
* XML的编程
* JAXP的SAX解析(了解的怎么样解析)
* 只能做查询,不能做增删改。
* SAX解析
* 解析器
* 获取解析器的工厂
* 获取解析器对象
* 解析XML(XML的文件的地址,事件处理器)
* 事件处理器
* 自己编写的类,需要继承DefalutHandler类,重写三个方法。
* startElement()
* characters()
* endElement()
* SAX的解析原理:
解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分, (边读边解析)
都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,
会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
事件处理器由程序员编写,程序员通过事件处理器中方法的参数,
就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
* DOM4J的解析(企业中用的多)
* 先下载DOM4J相应的jar包。导入工程中,才能使用。
* 把dom4j-1.6.1.jar导入到工程中。
* WEB项目:复制dom4j-1.6.1.jar到 WebRoot -- WEB-INF -- lib里面。就ok。
* DOM4J对XPATH的支持
* 导入包。jaxen-1.1-beta-6.jar。
* 怎么使用?
selectNodes("/AAA") 返回集合
selectSingleNode() 一个Node对象
* 参数就是xpath的语法
* /AAA/BBB 获取BBB的节点
* //BBB 无论层级关系,找到BBB的节点
* * 代表是所有
* /AAA/BBB[1] 找到BBB的第一个 /AAA/BBB[last()] 最后一个
* @ 属性
*