XML语言讲解

来源:互联网 发布:罗克韦尔变频器软件 编辑:程序博客网 时间:2024/05/16 15:25

一、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、转义字符:对于一些单个字符,若想显示其原始字样,也可以使用转义的形式处理

  • &:&amp;
  • <:&lt;
  • >:&gt;
  • ":&quot;
  • ':&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();


0 0