XML:
在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在开始标签和结束标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。例如:
XML是被设计用来存储数据、携带数据和交换数据的,他不是为了显示数据而设计的。
通过XML,我们可以在不兼容的系统之间交换数据。
XML技术除用于保存有关系的数据之外,它还经常用作软件配置文件,以描述程序模块之间的关系。
在一个软件系统中,为提高系统的灵活性,它所启动的模块通常由其配置文件决定
例如一个软件在启动时,它需要启动A、B两个模块,而A、B这两个模块在启动时,又分别需要A1、A2和B1、B2模块的支持,为了准确描述这种关系,此时使用XML文件最为合适不过。
一个XML文件分为如下几部分内容:
文档声明 元素属性注释 CDATA区 、特殊字符 处理指令(processing instruction)
l Tip:XML语法-文档声明
在编写XML文档时,需要先使用文档声明,声明XML文档的类型。
最简单的声明语法:
用encoding属性说明文档的字符编码:
用standalone属性说明文档是否独立:
常见错误:
1.
2. 注意空格问题(全角半角中文还是英文的空格) IE打开 try
3.编码错误
XML文档乱码的原因
保存的时候先保存到硬盘上 硬盘上没有中国 通过gb2312编码 可能编出来98 99 再用IE浏览器显示的时候 按照UTF-8来解析的时候 98 99就成了乱码了
解决办法: 再保存的时候 点另存为 指定编码类型为UTF-8
或者使用eclipse 自动指定类型utf-8
l Tip:元素 (1)
XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:
包含标签体:www.itcast.cn
一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:
格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。
对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。
第一段:
<网址>www.itcast.cn网址>
第二段:
<网址>
www.itcast.cn
网址>
由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。
l 元素命名规范
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
区分大小写,例如,
和
是两个不同的标记。
不能以数字或"_" (下划线)开头。
不能以xml(或XML、或Xml 等)开头。
不能包含空格。
名称中间不能包含冒号(:)。
l Tip:属性
一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:
属性值一定要用双引号(")或单引号(')引起来
定义属性必须遵循与标签相同的命名规范
多学一招:在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述,例如:
l Tip:注释
Xml文件中的注释采用:“” 格式。
注意:
XML声明之前不能有注释
注释不能嵌套,例如:
……
-->
l Tip:CDATA区
在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。
遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。
原始内容输出 用cdata区
语法:
]]>
l Tip:转义字符
对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。
实例:
]]>
<b1></b1>
cdata和转义字符的区别: 对程序有区别
程序读的时候 一个读原始数据 一个读转义字符
给人看就转义 给程序原始样式用cdata
l Tip:处理指令
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。
处理指令必须以“”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。
实例程序:
Config.css
#a1{
font-size:300px;
color:red;
}
#a2{离线应用
font-size:100px;
color:green;
}
#b1{
font-size:20px;
}
#b2{
font-size:200px;
color:blue;
}
Config1.xml
l XML约束
Tip:XML约束概述
什么是XML约束
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
为什么需要XML约束
常用的约束技术
XML DTD
XML Schema
l Tip:DTD约束快束入门
DTD(Document Type Definition),全称为文档类型定义。
Dtd 要存为unicode或者utf-8
l Tip:编程校验XML文档正确性
IE5以上浏览器内置了XML解析工具:Microsort.XMLDOM,开发人员可以编写javascript代码,利用这个解析工具装载xml文件,并对xml文件进行dtd验证。
创建xml文档解析器对象
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
开启xml校验
xmldoc.validateOnParse = "true";
装载xml文档
xmldoc.load("book.xml");
获取错误信息
xmldoc.parseError.reason;
xmldoc.parseError.line
l Tip:编写DTD约束的两种方式
DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写。
l Tip:在xml文件内编写DTD
]>
<书架>
<书>
<书名>Java就业培训教程书名>
<作者>张孝祥作者>
<售价>39.00元售价>
书>
...
书架>
l Tip:引用DTD约束
XML文件使用 DOCTYPE6声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式:
当引用的文件在本地时,采用如下方式:
例如: 。在xml文件中手写一下。
当引用的文件是一个公共的文件时,采用如下方式:
例如:
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
l Tip: DTD 的语法细节:元素定义1
在DTD文档中使用ELEMENT声明一个XML元素,语法格式如下所示:
元素类型可以是元素内容、或类型
如为元素内容:则需要使用()括起来,如
如为元素类型,则直接书写,DTD规范定义了如下几种类型:
EMPTY:用于定义空元素,例如
ANY:表示元素内容为任意类型。
元素内容中可以使用如下方式,描述内容的组成关系
用逗号分隔,表示内容的出现顺序必须与声明时一致。
用|分隔,表示任选其一,即多个只能出现一个
在元素内容中也可以使用+、*、?等符号表示元素出现的次数:
+: 一次或多次 (书+)
?: 0次或一次 (书?)
*: 0次或多次 (书*)
也可使用圆括号( )批量设置,例
l Tip:属性定义
xml文档中的标签属性需通过ATTLIST为其设置属性
语法格式:
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明
……
>
属性声明举例:
类别 CDATA #REQUIRED
颜色 CDATA #IMPLIED
>
对应XML文件:
<商品 类别="服装" 颜色="黄色">…商品>
<商品 类别="服装">…商品>
l Tip:属性定义
l XML编程(CRUD)增删改查
dom解析
dom 全部装载到内存一下子解析 有内存的压力 适合增删改查
sax 执行一步解析一步 只适合读
l Tip:JAXP
JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成
在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。
l Tip:使用JAXP进行DOM解析
javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
l Tip:获得JAXP中的DOM解析器
调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
//创建解析工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//得到解析器
DocumentBuilder builder = factory.newDocumentBuilder();
System.out.println(builder);
//解析xml文档
Document d = (Document) builder.parse("src/book.xml");
l Tip:DOM编程
DOM模型(document object model)
DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
在dom中,节点之间关系如下:
位于一个节点之上的节点是该节点的父节点(parent)
一个节点之下的节点是该节点的子节点(children)
同一层次,具有相同父节点的节点是兄弟节点(sibling)
一个节点的下一个层次的节点集合是节点后代(descendant)
父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)
l Tip:Node对象
Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)
Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。
l 更新XML文档
javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。
Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:
javax.xml.transform.dom.DOMSource类来关联要转换的document对象,
用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。
Transformer对象通过TransformerFactory获得
l
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream(filename)));