JavaWeb/JavaEE      XML、DTD/Schema约束、解析   
文章目录  [隐藏]

一。XML入门

可扩展标记语言,用于描述关系型数据。xml文件为xml后缀的文本文件。

1. 语法:

使用配对的尖括号及问号包裹xml关键字。

1)声明:使用version设置版本

  <?xml version="1.0" ?>
  

2)编码:使用encoding设置字符集编码。同时文件保存时使用相同编码

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

  

3)独立声明:使用standalone设置是否使用约束文件

当没有此参数时,默认为yes-独立存在;设置为no指不可独立存在,必须指明约束文件。
  <?xml version="1.0" encoding="gb2312" standalone="yes" ?>
  

4)元素:

  xml文件中,包含唯一一个根元素,以及若干子元素,每个子元素可以包含下一级若干子元素。每个子元素都可以包含若干属性。
  (1)元素命名规范:
  (1)区分大小写。
  (2)不能以数字或"_" (下划)或xml开头。
  (3)中间不能包含冒号(:)、不能包含空格。
  (2)元素属性
  (1)属性值一定要用双引号(“)或单引号(‘)引起来。
  (2)定义属性必须遵循与元素相同的命名规范 (全用英文)。

2. 注释:

1)格式:

  <!-- 注释体 -->

2)注意:

  XML声明之前不能有注释。
  注释不能嵌套,且注释体中不宜出现--。

3)示例:

(1)样板:/h4>

  

(2)实例:

3. 代码块:

  <![CDATA[ 代码块 ]]> 。说明其中的代码块内容为普通文本,一般为了在网页中展示编程代码使用。
  语法:

  ]]>
[/crayon]

4. 转义字符:

  空格等特殊字符在解析时可能会被浏览器过滤掉而不能达到我们的理想效果,因此我们使用转义字符代替它们。

  示例:

  

二。DTD约束

  dtd文档类型定义文件是xml的约束文件。单独的dtd文件必须以utf-8编码保存。dtd约束的使用分为外部约束和内部约束。

1. 引入外部dtd文件:

  即创建一个dtd文件,然后在xml文件中引入。

1)xml引入语法:

(1)使用本地dtd文件:

  <!DOCUMENT 根节点 SYSTEM "test.dtd">

(2)使用网络dtd文件:

    <!DOCTYPE 根结点 PUBLIC "DTD名称" "DTD文件的URL">
    如:

2)dtd文件语法:

2.使用内部dtd约束:

  将dtd约束内容直接写入xml文件中。
  语法:

3. dtd语法:

1)声明xml文件中的元素:使用element关键字

(1)复杂元素:带有子元素

  <!ELEMENT 元素名称 (子元素1, 子元素2, 子元素3)>
  1》子元素的数量限制:
    ①子元素1最少出现一次:使用加号+标注
      <!ELEMENT 元素名称 (子元素1+, 子元素2, 子元素3)>
    ②子元素1最多出现一次:使用问号?标注
      <!ELEMENT 元素名称 (子元素1?, 子元素2, 子元素3)>
    ③子元素1出现任意:使用星号*标注
      <!ELEMENT 元素名称 (子元素1*, 子元素2, 子元素3)>
    ④没有标注加号、问号、星号表示必须出现且只出现一次
  2》子元素的序列限制:
    ①逗号限定了元素出现的先后顺序
    ②竖线|表示选择出现元素:
      如:必须出现元素1;然后元素2或者元素3出现一个,并且至少出现一次
      <!ELEMENT 元素名称 (子元素1, (子元素2 | 子元素3)+)>

(2)简单元素

  <!ELEMENT 元素名称 元素类型>
  元素类型包括:
   ① <!ELEMENT 元素名称 (#PCDATA)>
      PCDATA:被解析器解析的文本字符串
    ② <!ELEMENT 元素名称 (#CDATA)>
      CDATA:不会被解析器解析的文本字符串
    ③ <!ELEMENT 元素名称 EMPTY>
      EMPTY:空内容,不得填写任何元素体
    ④ <!ELEMENT 元素名称 ANY>
      ANY:任意内容

2)声明元素的属性:使用attlist关键字

(1)语法:

  <!ATTLIST 已有元素名称 自定义属性名称 属性类型 默认值>

(2)属性类型:

  ①CDATA: 值为字符数据
  ②(att1| att2|..): 值为枚举列表中的一个值
  ③ID: 值为唯一的id
  ④IDREF: 值为另外一个元素的id
  ⑤IDREFS: 值为其他id的列表
  ⑥NMTOKEN: 值为合法的XML名称
  ⑦NMTOKENS: 值为合法的XML名称的列表
  ⑧ENTITY: 值为一个实体
  ⑨ENTITIES: 值为一个实体列表
  ⑩NOTATION: 值为符号的名称
  xml: 值为一个预定义的XML值

(3)默认值:

  ①#REQUIRED: 属性值是必需的
  ②#IMPLIED: 属性值非必需的
  ③#FIXED "value": 属性值是固定的

3)声明实体:

  用于定义引用普通文本或特殊字符的快捷方式的变量,提高字段的复用性。

(1)引用实体:在dtd文件中定义,在xml文件中使用

  语法:
  dtd文件:<!ENTITY 实体名称 "实体的值">
  xml文件:<元素>&实体名称;</元素>

(2)参数实体:在dtd中定义,在dtd中使用

  语法:
  创建:<!ENTITY %实体名称 "值1 | 值2 | 值3">
  使用:<!ELEMENT 元素名 (%实体名称)+>

三。Schema约束

  XML Schema模式文档比dtd更加符合XML语法结构,其本身就是一个xml文件,扩展名通常为.xsd。Schema对名称空间支持得非常好,很容易被XML 解析器解析,比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
  XML Schema文档也必须有一个根结点,这个根结点的名称为Schema。
  XML Schema文档声明的元素通常绑定到一个名称空间(uri)上,以后XML文件就可以通过这个URI来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束。uri虽然是以http://开头,但是它可以不指向任何一个真实的地址,而仅仅是作为一个名称空间来声明。

1.引入xsd文件:

  使用xmlns关键字在xml文件中引入schema约束:

  说明:
  名称空间指向uri1, uriA包含在test.xsd文件中,test.xsd文件复合uriB的标准。
  “名称空间”: 自定义的名称
  “uriA”: 在xsd文件中指定的路径
  “uriB”: 一般是w3c指定的schema约束文件母体:www.w3.org/2001/XMLSchema-instance

2. xsd文件基本构造:

  编写风格同xml文件一样,保存为test.xsd文件即可。

  说明:
  “前缀”:   一般默认xs,规定来自命名空间 "http://www.w3.org/2001/XMLSchema"(未命名空间)的元素和数据类型应该使用前缀 xs。
  “targetNamespace”:   被此schema定义的元素来自 目标命名空间 uriA。
  “elementFormDefault”: 有作用域的,并且是被继承的,除非在子定义中覆盖父定义。
    1)qualified: 任何使用此schema约束中声明过的元素的xml文件都必须被此命名空间限定。
    2)unqualified: 除了全局元素或者类型将归于目标命名空间外,局部元素将归于无名命名空间。
  “element”: 声明xml中的元素,使用“name”指定元素名称。
  “complexType”: 指明上面刚声明的元素为复杂数据类型。此元素可以包含子元素,并使用指示器。
  “sequence”: Order指示器。用于定义元素的出现顺序。
  order指示器:
    1)all : 配合Occurrence指示器使用
    2)choice : 在给出的子元素里选择某个出现即可
    3)sequence :   按照当前特定的顺序出现
  “maxOccurs”: Occurrence指示器。用来定义元素出现的次数。
  occurrence指示器:
  maxOccurs :可出现的最大次数,默认1。unbounded表示不受限制。
  minOccurs :可出现的最小次数,默认1。unbounded表示不受限制。
  “简单数据类型”: 仅包含文本的元素。它不会包含任何其他的元素或属性。使用“type”声明。
  常用简单数据类型
    ①xs:string 字符串
    ②xs:decimal 浮点型
    ③xs:integer 整型
    ④xs:boolean 布尔值
    ⑤xs:date 日期
    ⑥xs:time 时间
  默认值和固定值:
    ①当在xml中没有被设定为其它值时,默认值就会自动分配给元素
      <xs:element name="color" type="xs:string" default="默认值"/>
    ②固定值同样会自动分配给元素,并且您无法设定为其它值。
      <xs:element name="color" type="xs:string" fixed="固定值"/>
  “attribute”:上面刚声明的元素的属性。
  常用属性类型:同上面元素的6个简单数据类型。
  默认值:当没有其他的值被规定时,默认值就会自动分配给元素。
    <xs:attribute name="属性名" type="xs:简单数据类型" default="默认值"/>
  固定值:固定值同样会自动分配给元素,并且您无法规定另外的值。
    <xs:attribute name="属性名" type="xs:简单数据类型" fixed="固定值"/>
  可选性:默认属性可无。如需规定必须有属性则使用"use":
    <xs:attribute name="属性名" type="xs:简单数据类型" use="required"/>

3.使用默认名称空间:

  仅在xml中使用xmlns引入一次即可。

4.不使用名称空间

  不用在xml文件中引入名称空间,仅使用未命名空间

  

四。XML解析

1.XML解析方式分为两种:dom和sax

  1. dom:(Document Object Model, 即文档对象模型)是W3C组织推荐的处理XML的一种内存加载方式。
  2. sax:(Simple API for XML)使用事件触发机制,XML社区的标准,几乎所有的XML解析器都支持它。
  

2.XML解析器(引擎):

操作xml文件的底层系统,都支持上面的两种解析方式
  1. Crimson(sun):性能最次,但它是标准
  2. Xerces(IBM):性能较好
  3. Aelfred2(dom4j) :性能最好

3.XML解析开发包(API):

将解析器封装已便于使用
  1. Jaxp(sun):支持两种方式(DOM和SAX)对XML文档进行解析
  2. dom4j(全新的api):性能优异、功能强大和极易使用
  3. pull解析(Andriod的sdk自带pull解析):采用事件触发的方式解析 xml 文档
  

4.Jaxp解析:

使用附上的demo.xml文件

1)dom方式:

  

(1)查询:

  

(2)插入:

2)sax方式:只能做读取且仅读取一次

5.Pull解析:

  须要使用独立的jar包:

  代码:

6.DOM4J解析:

  须要使用独立的jar包:

1)查询:

  

2)添加:

3)修改:

  

7. XPath&DOM4J:

1)导入一个新的jar包:

2)代码:

3)常用XPath:

  ①得到根元素AAA:
  document.selectNodes("/AAA");
  ②得到AAA中子元素DDD的全部BBB子元素:
  document.selectNodes("/AAA/DDD/BBB"); //匹配的BBB
  document.selectSingleNode("/AAA/DDD/BBB"); //第一个BBB
  ③得到全部的BBB元素:无论层级关系:
  document.selectNodes("//BBB"); //全部的BBB
  ④得到全部的父元素是DDD的BBB元素:
  document.selectNodes("//DDD/BBB"); //全部的BBB
  ⑤得到全部的路径依附于/AAA/CCC/DDD的元素:
  document.selectNodes("/AAA/CCC/DDD/*"); //DDD内全部的子元素
  ⑥得到全部的拥有3个父级元素的BBB元素:
  document.selectNodes("/*/*/*/BBB"); //匹配的BBB
  ⑦得到xml文件中全部元素:
  document.selectNodes("//*");
  ⑧得到AAA的第一个BBB子元素:
  document.selectNodes("/AAA/BBB[1]"); //匹配的BBB
  ⑨得到AAA的最后一个BBB子元素:
  document.selectNodes("/AAA/BBB[last()]"); //匹配的BBB
  ⑩得到有id属性的BBB元素:
  document.selectNodes("//BBB[@id]"); //匹配有id属性的BBB
  得到有任意属性的BBB元素:
  document.selectNodes("//BBB[@*]"); //匹配有任意属性的BBB
  得到全部没有属性的BBB元素:
  document.selectNodes("//BBB[not(@*)]"); //匹配任意没有属性的BBB
  得到含有属性id且其值为'b1'的BBB元素:
  document.selectNodes("//BBB[@id='b1']"); //匹配有属性id且值为bi的BBB
  得到含有2个BBB子元素的元素:
  document.selectNodes("//*[count(BBB)=2]"); //匹配 含有两个BBB子元素 的元素
  得到含有3个子元素的元素:
  document.selectNodes("//*[count(*)=3]"); //匹配 含有任意三个子元素 的元素
  得到全部名称为BBB的元素(这里等价于//BBB):
  document.selectNodes("//*[name()='BBB']"); //匹配 元素名为BBB 的元素
  得到全部名称以"B"起始的元素:
  document.selectNodes("//*[starts-with(name(),'B')]"); //匹配 元素名第一个字母为B 的元素
  得到全部名称包含"C"的元素
  document.selectNodes("//*[contains(name(),'C')]"); //匹配 元素名包含字母C 的元素

8.XStream解析:

  导入独立的jar包:
  xmlpull-*.jar
  xpp3_min-*.jar
  xstream-*.jar

1)写出xml文件:

2)读取xml数据:

附:xml文件


承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设