Day1 itheima_xml基础

1,主要内容

  

     XML及其语法
    XML约束之DTD
    XML编程(CRUD---Create Read Update Delete)
         • xml 解析器
              • dom
             • sax
             • dom4j
             • pull
    XML约束之Schema
2,什么是xml
 
      XML是指可扩展标记语言(e X tensible M arkup L anguage),它是一种 标记语言 ,很类似HTML。它被设计的 宗旨是表示数据 ,而 非显示数据
      XML标签 没有被预定义 ,需要用户 自行定义标签
      XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。
      XML被广泛认为是继Java之后在Internet上最激动人心的新技术。
3,xml技术用于解决什么问题?
   
   在现实生活中大量存在有关系的数据,如图所示。
   问题: 这样的数据如何交给计算机处理呢?
  
 
l XML 语言出现的根本目标在于描述上图那种,在现实生活中经常出现的有关系的数据。
l xm语言是一种通用的数据交换格式。
l XML 语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在开始标签和结束标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。例如:
l xml文件里的数据需要使用程序将其读出来.
 
<?xml version="1.0" encoding="UTF-8"?>

<中国>
	<北京>
		<海淀></海淀>
		<丰台></丰台>
	</北京>
	<广东>
		<广州></广州>
		<东莞></东莞>
	</广东>
	<湖北>
		<武汉></武汉>
		<襄阳></襄阳>
	</湖北>
</中国>

4,xml常见应用
 
l 在Java开发中,传统的配置文件是 *.properties 属性文件(key=value),而XML表示的数据更为丰富。
l XML技术除用于描述有关系的数据外,还经常用作软件配置文件,以描述程序模块之间的关系。( 如后面将要学习到的Struts 2 、Spring和Hibernate都是基于XML作为配置文件的 )
在一个软件系统中,通过XML配置文件可以提高系统的 灵活性 。即程序的行为是 通过XML文件来配置的,而不是硬编码
5,XML语法
l 一个 XML 文件分为如下几部分内容:
文档声明
元素
属性
注释 
CDATA 区 、特殊字符
处理指令( processing instruction (PI)
     文档声明
l 在编写XML文档时,需要先使用文档声明来声明XML文档。且 必须出现在文档的第一行
l 最简单的语法:<?xml version=“1.0”?>
l encoding 属性说明文档所使用的字符编码, 默认为UTF-8 保存在磁盘上的文件编码要与声明的编码一致。

  如:<?xml version=“1.0” encoding=“GB2312”?>

l standalone 属性说明文档是否独立,即是否依赖其他文档。

  如:<?xml version=“1.0” standalone=“yes”?>

l 常见的错误    标点符号中式的.
     元素
l XML 元素指 XML 文件中出现的标签。一个标签分为起始和结束标签 ( 不能省略 ) 。一个标签有如下几种书写形式:
包含标签主体: <mytag>some content</mytag>
不含标签主体: <mytag/>
l 一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,不允许有交叉嵌套。
<mytag1><mytag2></mytag1></mytag2>   WRONG
l 一个 XML 文档 必须有且仅有一个根标签 ,其他标签都是这个根标签的子标签或孙标签。
 
 l 对于 XML 标签中出现的所有空格和换行, XML 解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。
 

第一段:             

<中国><北京/></中国>

 

第二段:   给人看的

<中国>\r\n

\t  <北京/>

</中国>

l 由于在 XML 中,空格和换行都作为原始内容被处理,所以,在编写 XML 文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。 (查看 JQuery)

 

命名规范

  
l 一个 XML 元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
l 区分大小写,例如, <P> <p> 是两个不同的标记。
l 不能以数字或 "_" ( 下划线 ) 开头。
l 不能以 xml( XML 、或 Xml ) 开头。   xml保留的关键字
l 不能包含空格。
l 名称中间不能包含冒号( : ( 有特殊用途 )
 
属性
 
 
l 一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:

  <mytag name="value"/>

l 属性值一定要用双引号( " )或单引号( ' )引起来
l 定义属性必须遵循与标签相同的命名规范
l XML 技术中,标签属性所代表的信息,如果没有标签体,也可以被改成用子元素的形式来描述,例如:

  <mytag>

   <name>

     <firstname></firstnamename>

     <secondname></secondname>

   </name>

  </mytag>

注释

l Xml 文件中的注释采用: <!-- 这是注释 -->
l 注意:
XML 声明之前不能有注释
注释不能嵌套,例如:

  <!--大段注释

  ……

  <!--局部注释-->  Wrong

  ……

  -->  

 

6, CDATA
   
l CDATA C haracter D ata 的缩写
l 作用:把标签当做普通文本内容;
l 语法: <![CDATA[ 内容 ]]>
 

<![CDATA[

  <itcast>www.itcast.cn</itcast>

]]>

以上红色部分被当做普通文本而不是标签

7,特殊字符

 

l 对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。

8,处理指令

  

l 处理指令,简称 PI( P rocessing I nstruction)
l 作用:用来指挥软件如何解析 XML 文档。
l 语法:必须以“ <?” 作为开头,以“ ?>” 作为结尾。
l 常用处理指令:
XML 声明: <?xml version=“1.0” encoding=“GB2312”?>

xml-stylesheet指令

  

<?xml-stylesheet type=“text/css” href=“some.css”?>

注:对中文命名的标签元素不起作用

9,xml约束概述

   

l 什么是 XML 约束
XML 技术里,可以编写一个文档来约束一个 XML 文档的书写规范,这称之为 XML 约束。
l 约束技术
XML DTD
XDR
SOX
XML Schema

 

为什么需要约束?

  

l XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。( 如:Tomcat )
l xml常用来做配置文件,那么框架的使用者在用该框架的时候该怎么样写呢?
l 两个概念:
格式良好的XML:遵循XML语法的XML
有效的XML:遵循约束文档的XML
l 总之:约束文档定义了在XML中允许出现的 元素名称、属性及元素出现的 顺序等等。
 
10,xml约束之dtd
   DTD( Document Type Definition ) ,全称为文档类型定义

  

文件清单:book.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
	<书>
		<书名>Java就业培训教程</书名>
		<作者>张孝祥</作者>
		<售价>39.00元</售价>
	</书>
	<书>
		<书名>JavaScript网页开发</书名>
		<作者>张孝祥</作者>
		<售价>28.00元</售价>
	</书>
</书架>


 

DTD文件应使用UTF-8Unicode

 

文件清单:book.dtd
	
<!ELEMENT 书架 (书+)>
	<!ELEMENT 书 (书名,作者,售价)>
	<!ELEMENT 书名 (#PCDATA)>
	<!ELEMENT 作者 (#PCDATA)>
	<!ELEMENT 售价 (#PCDATA)>


 

  xml 内部编写DTD

 

DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写。(单独的DTD文件要以UTF-8保存)

在XML 文档中编写DTD示例

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
	<!ELEMENT 书架 (书+)>
	<!ELEMENT 书 (书名,作者,售价)>
	<!ELEMENT 书名 (#PCDATA)>
	<!ELEMENT 作者 (#PCDATA)>
	<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
	<书>
		<书名>Java就业培训教程</书名>
		<作者>张孝祥</作者>
		<售价>39.00元</售价>
	</书>
	...
</书架>

 

引入外部DTD文档

 

l XML 使用 DOCTYPE 声明语句来指明它所遵循的 DTD 文档,有两种形式:
当引用的 DTD 文档在本地时,采用如下方式:

<!DOCTYPE 根元素 SYSTEM “DTD文档路径”>

如:<!DOCTYPE 书架 SYSTEM “book.dtd”>

当引用的 DTD 文档在公共网络上时,采用如下方式:

<!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">

 

11,DTD约束语法细节

l 元素定义
l 属性定义
l 实体定义

 元素定义1

  

l DTD 文档中使用 ELEMENT 声明一个 XML 元素,语法格式如下所示:

   <!ELEMENT 元素名称元素类型>

l 元素类型可以是元素内容、或类型
如为元素内容:则需要使用 () 括起来,如

<!ELEMENT 书  (书名,作者,售价)>

<!ELEMENT 书名 (#PCDATA)>

如为元素类型,则直接书写, DTD 规范定义了如下几种类型:
EMPTY :用于定义空元素,例如 < br /> <hr/>

ANY:表示元素内容为任意类型

 

PCDATA

l PCDATA 的意思是被解析的字符数据( parsed character data )。
l 可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
l PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
l 文本中的标签会被当作标记来处理,而实体会被展开。
l 不过,被解析的字符数据不应当包含任何 & < 或者 > 字符;需要使用 &amp; & lt ; 以及 & gt ; 实体来分别替换它们。

CDATA

l CDATA 的意思是字符数据( character data )。

CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开

元素定义2

l 元素内容中可以使用如下方式,描述内容的组成关系
用逗号分隔,表示内容的出现顺序必须与声明时一致。 <!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>
| 分隔,表示任选其一,即多个只能出现一个

  <!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>

l 在元素内容中也可以使用 + 、*、 ? 等符号表示元素出现的次数:

  +: 一次或多次 (+)    

   ?: 0次或一次 (?)

   *: 0次或多次  (书*)

l 也可使用圆括号 ( ) 批量设置,例

  <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>

attribute 属性定义

 

l xml 文档中的标签属性需通过 ATTLIST 为其设置属性
l 语法格式:

  <!ATTLIST 元素名

  属性名1 属性值类型设置说明

  属性名2 属性值类型设置说明

  ……

  >

l 属性声明举例:

<!ATTLIST 商品

  类别 CDATA #REQUIRED

  颜色 CDATA #IMPLIED

>

l 对应 XML 文件:

  <商品类别="服装" 颜色="黄色">…</商品>

  <商品类别="服装">…</商品>

 

 

l 设置说明:
#REQUIRED :必须设置该属性
#IMPLIED :可以设置也可以不设置
#FIXED :说明该属性的取值固定为一个值,在 XML 文件中不能为该属性设置其它值。但需要为该属性提供这个值
直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若没设置则使用默认值。但需要为该属性提供这个值

 

l 举例:

      <!ATTLIST页面作者

       姓名 CDATA #IMPLIED

       年龄 CDATA #IMPLIED

       联系信息 CDATA #REQUIRED

       网站职务 CDATA #FIXED "页面作者"

       个人爱好 CDATA "上网"

       >

常用属性值类型

CDATA 表示属性值为普通文本字符串
ENUMERATED
ID  indentity
ENTITY( 实体 )

属性值类型àENUMERATED

属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值 ( 枚举 )

 

<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
	<!ELEMENT 肉 EMPTY>
	<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
     <肉 品种 ="鱼肉"/>
     <肉 品种 ="牛肉 "/>
     <肉/>
</购物篮>

属性值类型 ID

表示属性的设置值为一个唯一值。
ID 属性的值只能由字母,下划线开始,不能出现空白字符
<?xml version = "1.0" encoding="GB2312" ?>

<!DOCTYPE 联系人列表[
	<!ELEMENT 联系人列表 ANY>
	<!ELEMENT 联系人 (姓名,EMAIL)>
	<!ELEMENT 姓名 (#PCDATA)>
	<!ELEMENT EMAIL (#PCDATA)>
	<!ATTLIST 联系人 编号 ID #REQUIRED>
]>

<联系人列表>
	<联系人 编号="a1">
		<姓名>张三</姓名>
		<EMAIL>zhang@it315.org</EMAIL>
     </联系人>
	<联系人 编号="b1">
		<姓名>李四</姓名>
		<EMAIL>li@it315.org</EMAIL>
	</联系人>
</联系人列表>

实体定义

实体用于为一段内容创建一个别名,以后在 XML 文档中就可以使用别名引用这段内容了。
DTD 定义中,一条 <!ENTITY …> 语句用于定义一个实体。
实体可分为两种类型:引用实体和参数实体。


引用实体

 

l 引用实体主要 XML 文档中被应用
语法格式:
<!ENTITY 实体名称 "实体内容" > :直接转变成实体内容
引用方式:

&实体名称;

 举例:

  <!ENTITY shit"oh, holy shit">

   ……

   &shit;

参数实体

 

参数实体被 DTD 文件自身使用
语法格式:

   <!ENTITY % 实体名称 "实体内容" >

引用方式:

%实体名称;

  举例 1

   

 <!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
	
    <!ELEMENT 个人信息 (% TAG_NAMES; | 生日)>
	 <!ELEMENT 客户信息 (% TAG_NAMES; | 公司名)>


举例2

<!ENTITY % common.attributes
	 " id ID #IMPLIED 
	account CDATA #REQUIRED "
>
...
<!ATTLIST purchaseOrder  %common.attributes;>
<!ATTLIST item %common.attributes;>


12  XML编程(CRUD)

  java 解析xml概述

    

l XML 解析方式分为两种: DOM 方式和 SAX 方式
DOM Document Object Model ,文档对象模型。这种方式是 W3C 推荐的处理 XML 的一种方式。
SAX Simple API for XML 。这种方式不是官方标准,属于开源社区 XML-DEV ,几乎所有的 XML 解析器都支持它。
l XML 解析开发包
JAXP SUN 公司推出的解析标准实现。
Dom4J 是开源组织推出的解析开发包。 ( 牛,大家都在用,包括 SUN 公司的一些技术的实现都在用 )
JDom :是开源组织推出的解析开发包。

 

JAXP

JAXP:(Java API for XML Processing) 开发包是 JavaSE 的一部分,它由以下几个包及其子包组成:
org.w3c.dom: 提供 DOM 方式解析 XML 的标准接口
org.xml.sax: 提供 SAX 方式解析 XML 的标准接口
javax.xml: 提供了解析 XML 文档的类
l javax.xml.parsers 包中,定义了几个工厂类。我们可以通过调用这些工厂类,得到对 XML 文档进行解析的 DOM SAX 解析器对象。
DocumentBuilderFactory
SAXParserFactory

 

使用JAXP进行DOM解析

javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回

 

 

获得JAXP中的DOM解析器

 

调用 DocumentBuilderFactory.newInstance () 方法得到创建 DOM 解析器的工厂。
调用工厂对象的 newDocumentBuilder 方法得到 DOM 解析器对象。
调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进而可以利用 DOM 特性对整个 XML 文档进行操作了。
 
Dom编程
  
DOM 模型 (document object model)
DOM 解析器在解析 XML 文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个 Node 对象 ( 节点 )
dom 中,节点之间关系如下:
位于一个节点之上的节点是该节点的父节点 (parent)
一个节点之下的节点是该节点的子节点( children
同一层次,具有相同父节点的节点是兄弟节点( sibling
一个节点的下一个层次的节点集合是节点后代 (descendant)
父、祖父节点及所有位于节点上面的,都是节点的祖先 (ancestor)
 
节点类型
 Node对象
   
 Node 对象提供了一系列常量来代表结点的类型,当开发人员获得某个 Node 类型后,就可以把 Node 节点转换成相应的节点对象 (Node 的子类对象 ) ,以便于调用其特有的方法。(查看 API 文档)
 Node 对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个 XML 文档的内容、或添加、修改、删除 XML 文档的内容了。
 
更新xml文档
 
l javax.xml.transform 包中的 Transformer 类用于把代表 XML 文件的 Document 对象转换为某种格式后进行输出,例如把 xml 文件应用样式表后转成一个 html 文档。利用这个对象,当然也可以把 Document 对象又重新写入到一个 XML 文件中。
l Transformer 类通过 transform 方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:
javax.xml.transform.dom.DOMSource 类来关联要转换的 document 对象,
javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。
  Transformer 对象通过 TransformerFactory 获得
 
SAX解析
  在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的 Doucment 对象,从而再对 XML 文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。  
  SAX 解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才对文档进行操作。
 
SAX 采用事件处理的方式解析 XML 文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:
解析器可以使用 JAXP API 创建,创建出 SAX 解析器后,就可以指定解析器去解析某个 XML 文档。
解析器采用 SAX 方式在解析某个 XML 文档时,它只要解析到 XML 文档的一个 组成部分 ,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的 xml 文件内容作为 方法的参数 传递给事件处理器。
事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到 sax 解析器解析到的数据,从而可以决定如何对数据进行处理
 
 
l 阅读 ContentHandler API 文档,常用方法: startElement endElement characters
SAX 方式解析 XML 文档
l 使用 SAXParserFactory 创建 SAX 解析工厂

SAXParserFactoryspf = SAXParserFactory.newInstance();

l 通过 SAX 解析工厂得到解析器对象 

SAXParser sp = spf.newSAXParser();

l 通过解析器对象得到一个 XML 的读取器

XMLReaderxmlReader = sp.getXMLReader();

l 设置读取器的事件处理器 

xmlReader.setContentHandler(new BookParserHandler());

l 解析 xml 文件 

xmlReader.parse("book.xml");

 

DOM4J解析XML文档

l Dom4j 是一个简单、灵活的开放源代码的库。 Dom4j 是由早期开发 JDOM 的人分离出来而后独立开发的。与 JDOM 不同的是, dom4j 使用接口和抽象基类,虽然 Dom4j API 相对要复杂一些,但它提供了比 JDOM 更好的灵活性。
l Dom4j 是一个非常优秀的 Java XML API ,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的 Dom4j ,例如 Hibernate ,包括 sun 公司自己的 JAXM 也用了 Dom4j
l 使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件。
l DOM4j 中,获得 Document 对象的方式有三种:

  1.读取XML文件,获得document对象            

                   SAXReader reader = new SAXReader();
 
             Document   document = reader.read(new File("input.xml"));

  2.解析XML形式的文本,得到document对象.

                   String text = "<members></members>";
 
             Document document = DocumentHelper.parseText(text);

  3.主动创建document对象.

                  Document document = DocumentHelper.createDocument();
 
            //创建根节点

                  Element root = document.addElement("members");

节点对象

 

l 1. 获取文档的根节点 .

      Element root = document.getRootElement();

l 2. 取得某个节点的子节点 .

  Element element=node.element(“书名");

l 3. 取得节点的文字

      String text=node.getText();

l 4. 取得某节点下所有名为“ member” 的子节点,并进行遍历 .
 
List nodes = rootElm.elements ("member");
 

  for ( Iterator it = nodes.iterator (); it.hasNext ();) {
 
    Element elm = (Element) it.next ();
 
   // do something
 }
l 5. 对某节点下的所有子节点进行遍历 .
  
 for( Iterator it= root.elementIterator (); it.hasNext ();){
 
      Element element = (Element) it.next ();
 
      // do something
    }
l 6. 在某节点下添加子节点 .
Element
ageElm = newMemberElm.addElement ("age");
l 7. 设置节点文字 .
 
element.setText ("29");
l 8. 删除某节点 .
//
childElm 是待删除的节点 , parentElm 是其父节点

    parentElm.remove(childElm);

l 9. 添加一个 CDATA 节点 .
Element
contentElm = infoElm.addElement ("content");
contentElm.addCDATA ( diary.getContent ());

节点对象属性

l 1. 取得某节点下的某属性
 
    Element root= document.getRootElement ();    
 
   // 属性名 name

         Attribute attribute=root.attribute("size");

l 2. 取得属性的文字
 
    String text= attribute.getText ();
l 3. 删除某属性
 
Attribute attribute = root.attribute ("size");
 
root.remove (attribute);

节点对象属性

l 3. 遍历某节点的所有属性
 
   Element root= document.getRootElement ();    
 
 for( Iterator it= root.attributeIterator (); it.hasNext ();){
 
        Attribute attribute = (Attribute) it.next ();
 
        String text= attribute.getText ();
 
         System.out.println (text);
 
   }
l 4. 设置某节点的属性和文字 .
  
newMemberElm.addAttribute ("name", " sitinspring ");
l 5. 设置属性的文字
  
Attribute attribute = root.attribute ("name");
 
   attribute.setText (" sitinspring ");

将文档写入XML文件

 

l 1. 文档中全为英文 , 不设置编码 , 直接写入的形式 .
 
XMLWriter writer = new XMLWriter (new  FileWriter ("output.xml"));
 
writer.write (document);
 
writer.close ();
l 2. 文档中含有中文 , 设置编码格式写入的形式 .
OutputFormat format = OutputFormat.createPrettyPrint ();
//
指定 XML 编码                  

     format.setEncoding("GBK");       
XMLWriter writer = new XMLWriter(new FileOutputStream("output.xml"),format);
writer.write(document);
writer.close();

字符串与xml的转换

 

l 1. 将字符串转化为 XML
 

     String text = "<members> <member>sitinspring</member></members>";
Document
document = DocumentHelper.parseText(text);

l 2. 将文档或节点的 XML 转化为字符串 .

     SAXReader reader = new SAXReader();
Document  
document = reader.read(new File("input.xml"));            
Element root=
document.getRootElement();    

            
String docXmlText=document.asXML();

String rootXmlText=root.asXML();
Element
memberElm=root.element("member");
String
memberXmlText=memberElm.asXML();

pull解析器

l pull 解析器是一个第三方的开源api,其解析原理与sax 解析原理很相像,都是采用事件驱动的方式.
l 不同点: pull 解析器在每次读取到一段数据之后,需要程序员手动的调用其next() 方法,将当前解析到的这一行的"指针"移到下一行.
l http://www.xmlpull.org  &
l http://kxml.sourceforge.net/kxml2/

 

l 在目前的android 平台中解析xml 文件都是采用pull解析器,是谷歌力推的xml解析器
l pull 解析器是一个开源的 java 项目,既可以用于 android ,也可以用于 JavaEE
l 在android源码根目录的libcore目录下存放的是pull 解析器相关的所有类库.

XML约束之Schema

l XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性
l XML Schema VS DTD
XML Schema 符合 XML 语法结构。
DOM SAX XML API 很容易解析出 XML Schema 文档中的内容。
XML Schema 名称空间 支持得非常好。
XML Schema XML DTD 支持更多的数据类型,并支持用户自定义新的数据类型。
XML Schema 定义约束的能力非常强大,可以对 XML 实例文档作出细致的语义限制。
XML Schema 不能像 DTD 一样定义实体,比 DTD 更复杂,但 Xml Schema 现在已是 w3c 组织的标准,它正逐步取代 DTD 。 
 
Schema约束快速入门
l XML Schema 文件自身就是一个 XML 文件,但它的扩展名通常为 . xsd
l 一个 XML Schema 文档通常称之为 模式文档 ( 约束文档 ) ,遵循这个文档书写的 xml 文件称之为 实例文档
l XML 文件一样,一个 XML Schema 文档也必须有一个根结点,但这个根结点的名称为 Schema
l 编写了一个 XML Schema 约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在 XML Schema 技术中有一个专业术语来描述这个过程,即把 XML Schema 文档声明的元素绑定到一个 名称空间 上,以后 XML 文件就可以通过这个 URI (即名称空间)来告诉解析引擎, xml 文档中编写的元素来自哪里,被谁约束。
 
<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
					  targetNamespace="http://www.itcast.cn"
					  elementFormDefault="qualified">
	<xs:element name='书架' >
		<xs:complexType>
			<xs:sequence maxOccurs='unbounded' >
				<xs:element name='书' >
					<xs:complexType>
						<xs:sequence>
							<xs:element name='书名' type='xs:string' />
							<xs:element name='作者' type='xs:string' />
							<xs:element name='售价' type='xs:string' />
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>

<itcast:书架 xmlns:itcast="http://www.itcast.cn"
				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
				xsi:schemaLocation=“http://www.itcast.cn book.xsd">

	<itcast:书>
		<itcast:书名>JavaScript网页开发</itcast:书名>
		<itcast:作者>张孝祥</itcast:作者>
		<itcast:售价>28.00元</itcast:售价>
	</itcast:书>
</itcast:书架>
名称空间的概念
l XML Schema 中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的 URI Uniform Resource Identifier ,统一资源标识符)表示。在 Xml 文件中书写标签时,可以通过名称空间声明( xmlns ),来声明当前编写的标签来自哪个 Schema 约束文档。如:

  <itcast:书架 xmlns:itcast=“http://www.itcast.cn”>

  <itcast:>……</itcast:>

  </itcast:书架>

   此处使用itcast来指向声明的名称,以便于后面对名称空间的引用。

l 注意:名称空间的名字语法容易让人混淆,尽管以 http:// 开始,那个 URL 并不指向一个包含模式定义的文件。事实上,这个 URL http://www.itcast.cn 根本没有指向任何文件,只是一个分配的名字。
使用名称空间引入Schema
l 为了在一个 XML 文档中声明它所遵循的 Schema 文件的具体位置,通常需要在 Xml 文档中的根结点中使用 schemaLocation 属性来指定,例如:

  <itcast:书架 xmlns:itcast="http://www.itcast.cn"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation=“http://www.itcast.cn book.xsd">

l schemaLocation 此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置, 两者之间用空格分隔
l 注意,在使用 schemaLocation 属性时,也需要指定该属性来自哪里。
使用默认名称空间
基本格式:
	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">
		<书>
		<书名>JavaScript网页开发</书名>
		<作者>张孝祥</作者>
		<售价>28.00元</售价>
		</书>
	<书架>


使用名称空间引入多个XML Schema文档

文件清单:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>

<书架 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">
	<书>
		<书名>JavaScript网页开发</书名>
		<作者>张孝祥</作者>
		<售价 demo:币种=”人民币”>28.00元</售价>
	</书>
</书架>


不使用名称空间引入XML Schema文档

 

文件清单:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="xmlbook.xsd">
	<书>
		<书名>JavaScript网页开发</书名>
		<作者>张孝祥</作者>
		<售价>28.00元</售价>
	</书>
</书架>

XML Schema文档中声明名称空间

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

         targetNamespace="http://www. itcast.cn"

         elementFormDefault="qualified">

<xs:schema>

l targetNamespace 元素用于指定 schema 文档中声明的元素属于哪个名称空间。

elementFormDefault元素用于指定,该schema文档中声明的根元素及其所有子元素都属于targetNamespace所指定的名称空间

 

 

 


 

 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值