XML语言
一、XML语言
1、什么是XML语言?
Extensible Markup Language,翻译为可扩展标记语言。Xml技术是w3c组织发布的,目前遵循的是W3C组织在2000年发布的XML1.0规范。
2、XML语言用语解决什么类型的问题?
xml语言出现的根本目标是,描述有关系的数据。
在xml语言中,允许用户自定义标签。一个标签用于描述一段数据,一个标签可以分为开始标签和结束标签,子啊开始标签和结束标签之间,又可以使用其他标签其他数据,以此来实现数据关系的描述。
3、xml语言常见应用
xml语言除了保存有关系的数据之外,还经常用作配置文件,以描述程序模块之间的关系
二、XML语法
(一)、文档证明
1、在编写XML文档时,需要先使用文档声明,声明XML文档的类型。
2、最简单的声明语法:<?xml version="1.0" ?>
3、用encoding属性说明文档的字符编码:<?xml version="10" encoding="GB2312" ?>
4、用standalone属性说明文档的独立性:<?xml version="1.0" encoding="GB2312" standalone="yes" ?>
(二)、元素
1、XML元素指xml文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写格式:
包含标签体:<a>itcast</a>
不包含标签体:<a></a>简写成</a>
2、一个标签中可以嵌套若干个子标签,但所有的标签必须合理的嵌套,决不允许交叉嵌套。
如:<a>welcome<b>itcast</a></b>
3、格式良好的XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签。
4、对于XML文档中出现的空格和换行,XML解析程序会当做标签内容进行处理。
由于在XML文档中,空格和换行都作为原始内容处理,在编写XML文档时,使用缩进和换行等方式让原文件的内容清晰可读。
5、命名规范
一个XML文档可以包括字母、数字以及其他一些可见字符,但必须遵守以下的规范:
区分大小写:<P>和<p>是两个不同的标记
不能以数字和_开头
不能以XML(或Xml,或xml等)开头
不能包含空格
名称中间不能包含冒号(:)
(三)、属性
1、一个标签可以有多个属性,每个属性都有他自己的名称和取值
2、属性值一定要用双引号("")或单引号(’’)引起来
3、定义属性必须遵守和标签相同的命名规范
4、在XML技术中,标签属性所代表的信息,也可以改用子元素的形式来描述
例如:<input name="text">改写成<input> <name>text</name> </input>
(四)、注释
1、XML文档中注释采用:<!--注释-->
2、注意事项
- XML声明之前不能有注释
注释不能嵌套
(五)、CDATA、特殊字符
1、在编写XML文件时,有些内容可能不想让解析引擎执行,而是当做原始内容处理。遇到此种情况,可以把这些内容放到CDATA区里,对于CDATA 区域的内容,XML解析程序不会处理,而是直接原封不动的输出。
2、语法:<![CDATA[内容]]>
如:<![CDATA[<itcast><br/></itcast>]]>
3、转义字符:对于一些单个字符,若想显示其原始字样,也可以使用转义的形式处理
&:&;
<:<;
>:>;
":";
':&apos;
(六)、处理指令
1、处理指令:简称PI(processing instruction),用来指挥解析引擎如何解析XML文档内容。
例如,在XML文档中,可以使用xml-stylesheet指令,通知xml解析引擎,应用css文件显示xml文档内容
<?xml-stylesheet type="text/css" href="1.css"?>
2、处理指令必须以<?作为开头,以?>作为结尾,XML声明语句就是最常见的一种处理指令。
三、XML约束
(一)、XML约束简述
1、什么是XML约束?
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这就称之为XML约束。
2、常见的约束技术
XML DTD(Document Type Definition 文档类型定义)
XML Schema
(二)、DTD约束
1、变成校验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;
2、编写DTD约束的两种方式:
DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE[
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
XML文件使用DOCTYPE声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式:
(1)、当引用的文件在本地时,采用如下方式:<!DOCTYPE 文档根结点 SYSTEM “DTD文件的URL”>
例如:<!DOCTYPE 书架 SYSTEM "book.dtd">
(2)、当引用的文件是公共文件时,采用如下方式:<!DOCTYPE 文件根结点 PUBLIC “DTD名称” “DTD文件的URL”>
例如:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
3、DTD约束的语法细节
元素定义
(1)在DTD文档中使用ELEMENT声明一个XML元素,语法格式:
<!ELEMENT 元素名称 元素类型>
(2)元素类型可以是元素内容、或类型:
A、如为元素内容,需要使用()括起来:
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
B、如为元素类型,则直接书写,DTD规范了一下几种规范:
EMPTY:用语定于空元素
ANY:表示元素为任意类型
(3)元素内容可以使用一下方式,描述内容的组成关系
A、用逗号分隔,表示内容的出现顺序必须与生命一致
B、用|分割,表示任选其一,即多个只能出现一个
C、元素内容使用空白分隔符,表示出现的内容没有要求
(4)在元素内容中也可以使用+、*、?等符号表示元素出现的次数
A、+:一次货多次(书+)
B、:0次或多次(书)
C、?:0次或1次(书?)
(5)也可以使用()批量设置
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
属性定义
(1)XML文档中的标签属性需通过ATTLIST为其设置属性
(2)语法格式:
<!ATTLIST 元素名
属性名 属性值类型 设置说明
>
(3)属性声明举例:
<!ATTLIST 商品
颜色 CDATA #REQUIRED
类别 CDATA #IMPLIED
>
(4)设置说明
A、#REQUIRED:必须设置该属性
B、#IMPLIED:可以设置也可以不设置
C、#FIXED:说明该属性的取值固定为一个值,在XML文件中不能为该属性设置其他值。但需要为该属性提供这个值
D、直接使用默认值:在XML文档中可以设置这个值,也可以不设置这个值,若没设置则使用默认值
举例:
<!ATTLIST 页面作者
姓名 CDATA #IMPLIED
年龄 CDATA #IMPLIED
联系信息 CDATA #REQUIRED
网站职务 CDATA #FIXED "页面作者"
个人爱好 CDATA "上网"
>
(5)常用属性值说明
A、CDATA:表示属性为普通文本字符串
B、ENUMERATED:设置的类型可以是一组取值的列表,在XML文件中设置的属性值只能是这个列表中的取值(枚举)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 购物篮[
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
C、ID:表示属性的设置值为一个唯一值,只能有字母及_开始,不能出现空白字符
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名,EMAIL)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ATTLIST 联系人 编号 ID #REQUIRED>
]>
实体定义
ENTITY:用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容,<!ENTITY…>
实体可以分为两种类型:引用实体和参数实体
(1)引用实体:主要在XML文档中被引用
A、语法格式:<!ENTITY 实体名称 “实体内容”>
B、引用方式:&实体名称;
(2)参数实体:被DTD文件自身使用
A、语法格式:<!ENTITY %实体名称 “实体内容”>
B、引用方式:%实体名称
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
<!ELEMENT 个人信息 (%TAG_NAMES; | 生日)>
<!ELEMENT 客户信息 (%TAG_NAMES; | 公司名)>
(三)Schema约束
1、XML Schema也是一种定义和描述XML文档内容和结构的谋杀语言,其出现是为了克服DTD的局限性。
2、Schema VS DTD:
XML Schema符合XML的语法结构
DOM/SAX等XML API很容易解析出XML Schema中的内容
Schema对名称空间支持的非常好
Schema比DTD支持更多的数据类型,并支持用户自定义的新数据类型
Schema定义约束的能力非常强大,可以对XML实例文档做出细致的语义限制
Schema不能像DTD一样定义实体,比DTD更复杂,但Schema现在已是w3c组织的标准,它正在逐步取代DTD
3、快速入门
Schema文件自身就是一个XML文件,但它的扩展名通常为.xsd
一个Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档
和xml文件一样,一个Schema文档也必须有一个根节点,但这个根节点的名称为Schema
编写了一个Schema约束文档后,通常需要把这个文件中申明的元素绑定到一个URI地址上,在Schema技术中一个专业术语来描述这个过程,即把Schema文档中声明的元素绑定到一个名称空间上,以后XML文件就可以通过URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束
4、案例book.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3c.org/2001/XMLSchema" targetName spcae="http://www.itcast.cn" elementFormDe foult ="quailified">
<xs:element name="书架">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="书">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name='书名' type='xs:string' />
<xs:element name='作者' type='xs:string' />
<xs:element name='售价' type='xs:string' />
</sequence>
</xs:complexType>
</xs:element>
</sequence>
</xs:complexType>
</xs:element>
</xs:xchema>
5、名称空间的概念
(1)在Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。在XML文件中写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档
注意:名称空间的名字语法很容易让人混淆,尽管以http://开始,哪个URL并不只想一个包含模式定义的文件。事实上,这个URL(http://www.itcast.cn)根本没有只想任何文件,只是一个分配的名字。
(2)为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在XML文档中的根节点中使用shemaLoction属性来指定,例如:
<itcast:书架 xmlns:itcast="http://wwwitcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLoction="http://www.itcast.cn book.xsd"
(3)schemaLoction此属性有两个值,第一个值是需要使用的名称空间,第二个值是供命名空间使用的XML schema文件的位置,两者之间用空格分割。
注意:使用shemaLocation属性时,也需要指定该属性来自哪里。
(4)使用默认名称空间:
xmlns="URI"
<书架 xmlns="http://www.it315.org/xmlbook/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.itcast.cn book.xsd"
>
<书></书>
</书架>
(5)使用名称空间引入多个schema文档
<书架 xmlns="http://www.it315.org/xmlbook/schema"
xmlns:demo="http://www.it315.org/demo/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.it315.org/xmlbook/schema
http://www.it315.org/xmlbook.xsd
http://www.it315.org/demo/schema http://www.it315.org/demo.xsd">
(6)不实用名称空间引入schema文档
<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="xmlbook.xsd">
(7)在schema文档中声明名称空间
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www. itcast.cn"
elementFormDefault="qualified">
<xs:schema>
四、XML编程
(一)、XML解析技术概述
1、xml解析技术分为两种:dom和sax
dom:(Document Object Model,即文档对象模型)是w3c组织推荐的处理XML的一种方式
sax:(Simple AIP for Xml)不是官方推荐的,但他是XML社区事实上的标准,几乎所有xml解析器都支持它
2、XML解析器
Crimson
Xerces
Aelfred2
3、XML解析开发包
Jaxp
Jdom
dom4j
(二)、JAXP
1、JAXP开发包是JavaSE的一部分,它是由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成
2、在javax.xml.parsers包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对XML 解析的DOM或SAX的解析器对象
3、javax.xml.parsers包中的DocumentBiulderFactory用于创建DOM模式的解析器对象,DocumentBiulderFactory是一个抽象工厂类,它不能实例化,但是提供了一个newInstance的方法,这个方法会根据本平台默认安装的解析器,自动创建一个工厂的对象并返回。
调用DocumentBiulderFactory.newInstance()方法创建一个DOM解析器的工厂
调用工厂对象的newDocumentBiulder方法得到dom解析器对象
调用DOM解析器对象的parse方法解析xml文档,得到代表整个文档的Document对象,这样可以利用DOM特性操作整个xml文档
(三)、DOM解析
1、DOM解析器在解析XML文件时,会把文档中的所有元素,按照出现的层次关系,解析成一个一个Node对象(节点)
2、在DOM解析中,节点之间的关系如下:位于一个节点之上的节点是该节点的父节点;一个节点之下的节点是该节点的子节点;同一层次,具有相同父节点的节点是兄弟节点;一个节点的下一层次的节点集合是节点后代;父、祖父节点或所有位于节点上面的,都是节点的祖先
3、Node对象
Node对象提供了一些列常量来代表节点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。
Node对象提供了相应的方法区获得他的父节点或子节点,编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容。
4、DOM解析编程
遍历所有节点
查找某一个节点
删除节点
更新节点
添加节点
5、DOM编程练习
(四)、SAX解析
1、在使用DOM解析XML文档时,需要读取整个XML文档,在内存中架构代表整个DOM树的Document对象,从而再对XML文档继续拧操作。此种情况下,如果XML文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。
2、SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会进行操作。
3、SAX采用时间处理的方式解析XML文件,利用SAX解析XML文档,设计两个部分:解析器和事件处理器。
解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档
解析器采用SAX方式在解析某个XML文件时,它只要解析到XML文档中的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数,传递给事件处理器。
事件处理器由程序员编写,程序员通过时间处理器中方法的参数,就可以轻松的得到SAX解析器解析到的数据u,从而可以决定如何对数据进行处理。
4、SAX方式解析XML文档
使用SAXParserFactory创建SAX解析工厂:SAXParserFactory spf = SAXParserFactory.newInstance();
通过SAX解析工厂得到解析器对象:SAXParser sp = spf.newSAXParser();
通过解析器对象得到一个XML的读取器:XMLReader = sp.getXMLReader();
设置读取器的事件处理器:xmlReader.setContentHandler();
解析XML文件:xmlReader.parse(“book.xml”);
5、SAX解析编程
(五)、DOM4J解析XML文档
1、Dom4J是一个简单、灵活的开放源代码的库,Dom4J是由早起开发JDOM的人分离出来而后独立开发的。与JDom不同的是,dom4j使用接口和抽象类,虽然dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
2、DOM4J是一个非常优秀的Java XMLAPI,具有性能优异、功能强大和极易使用的特点,仙子阿很多软件此阿勇dom4j,例如Hibernate,包括sun公司自己的JAXM也是用dom4j。
3、使用dom4j开发,需下载dom4j相应的jar文件
4、Document对象
DOM4J中,获得Document对象的方式有3种:
读取XML文件,获得document对象:
SAXReader reader = new SAXReader();
Document document = resder.read(new File(“input.xml”));
解析XML形式的文本,得到document对象:
String text = “<members></members>”;
Document document = DocumentHelper.parseText(text);
主动创建document对象:
Document document = DocumentHelper.createDocument();
Element root = document.addElement(“members”);
5、节点对象
获取文档的根节点:
Element root = document.getRootElement();
取得某个节点的子节点:
Element element = node.element(“书名”);
取得节点的文字:
String text = node.getText();
取得某个节点下的所有名为“member”的子节点,并进行遍历
List nodes =rootElm.elements(“member”);
for(Iterator it = nodes.iterator();it.hasNext()){
Element element = (Element)it.next();
对某个节点下的所有子节点进行遍历
for(Iterator it = root.elementIterator();it.hasNext()){
Element element = (Element)it.next();
在某节点下添加子节点
Element ageElm = newMemberElm.addElement(“age”);
设置节点文字
element.setText(“29”);
删除某节点
parentElm。remove(childElm);
添加一个CDATA节点
Element contentElm = infoELm.addElement(“content”);
contentElm.addCDATA(diary.getContent());
6、节点属性
取得某节点下的某属性
Element root = document.getRootElement();
Attribute atttribute = attribute.getText();
取得属性的文字
String text = attribute.getText();
删除某属性
Attribute attribute = root.attribute("size");
root.remove(attribute);
便利某节点的所有属性
Element root = document.getRootElement();
for(Iterator it = root.attributeIterator();it.haNext()){
Attribute attribute = (Attribute)it,next();
String text = attribute.getText();
System.out.print(text);
设置某节点的属性和文字
newMemberElm.addAttribute("name","sitinspring");
设置属性的文字
Attribute attribute = root.attribute("name");
attribute.setText("sitinspring");
7、将文档写入XML文件
文档中全为英文,不设置编码,直接写入
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
文档中含有中文,设置编码格式写入的形式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
8、DOM4J在指定位置插入节点
得到插入位置的节点列表
调用list.add(index,element),由index决定element的插入位置
Element元素可以通过DocumentHelper对象得到。
示例代码:
Element aaa = DocumentHelper.createElement("aaa");
aaa.setText("aaa");
List list = root.element("书").elements();
list.add(1,aaa);
9、字符串和XML的转换
将字符串转化为XML
String text = "<members><member>sitinspring</member></members>";
Document document = DocumentHelper.parseText(text);
将文档或者节点的XML转化为字符串
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
Element root = document.getRootElement();
String docXml = document.asXML();
String rootXml = root.asXML();
Element memberElm = root.element.("member");
String memberXml = memberElm.asXML();