XML基础

XML概述

W3C组织简介

W3C是World Wide Web Consortium(万维网联盟)的缩写,它是对网络标准定制的一个非赢利组织,如HTML、XHTML、CSS、XML的标准就是由W3C来定制。
由W3C正式发布的标准称为W3C推荐标准。

什么是XML

是EXtensible Markup Language的缩写,它是一种类似于HTML的标记语言,称为可扩展标记语言,传输数据而不是显示数据,可以自定义标签,具有自我描述性
是一种通用的数据交换格式,可以使数据在各种应用程序之间轻松地实现数据的交换。

XML与HTML的比较

HTML中的标记是用来显示数据的,而XML中的标记用来描述数据的性质和结构。
HTML是不区分大小写的,而XML是严格区分大小写的。
HTML可以有多个根元素,而格式良好的XML有且只能有一个根元素。
HTML中,属性值的引号是可用可不用的,而XML中,属性值必须放在引号中。
HTML中,空格是自动过滤的,而XML中,空格则不会自动删除。
HTML中的标记是预定义的,而XML中的标记是可以随便定义的,并且可扩展。
注意:XML不是HTML的升级,也不是HTML的替代产品,它们的应用领域和范围完全不同

XML语法

文档声明

在一个完整的XML文档中,必须包含一个XML文档声明,这个声明表示该文档是一个XML文档,以及该文档遵循哪个XML版本的规范。

XML文档声明的语法格式如下所示:
<?xml 版本信息[编码信息][文档独立性信息]?>
从上面的语法格式中可以看出,文档声明以符号“<?”开头,以符号“?>”结束,中间可以声明版本信息,编码信息以及文档独立性信息。

一个完整的XML声明如下所示:
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
版本声明version、文档编码声明encoding、独立文档声明standalone默认为no

注意:XML声明必须位于文档的第一行,前面不能有任何字符。在XML声明时,如果同时设置了encoding和standalone属性,standalone属性要位于encoding属性之后。

元素定义

在XML文档中,主体内容都是由元素(Element)组成的。
元素一般是由开始标记,属性,元素内容和结束标记构成,具体示例如下:
<城市>北京</城市>

需要注意的是,如果一个元素没有嵌套在其它元素内,则这个元素称为根元素,根元素是XML文档定义的第一个元素。

一个元素中如果没有嵌套子元素,也没有包含文本内容,则这样的元素称为空元素,空元素可以不使用结束标记,例如:<img></img>可以简写成<img/>。

在XML文档中,元素的名称可以包含字母、数字以及其它一些可见的字符,但是在命名XML元素时,应该遵守以下规范:
(1)区分大小写,例如:<P>和<p>是两个不同的标记。
(2)元素名称中,不能包含空格、冒号、分号、逗号和尖括号等,元素不能以数字开头,否则XML文档会报错。
(3)建议不要使用“.”,因为在很多程序语言中,“.”用于引用对象的属性。
(4)建议不要用减号(-),而以下划线(_)代替,以避免与表达式中的减号(-)运算符发生冲突。
(5)建议名称不要以字符组合xml(或XML、或Xml等)开头。
(6)建议名称的大小写尽量采用同一标准,要么全部大写,要么全部小写。
(7)名称可以使用非英文字符,例如中文,但有些软件可能不支持非英文字符以外的字符,在使用时应考虑这种情况。

属性定义

在XML文档中,可以为元素定义一个或多个属性,属性是对元素的进一步描述和说明,每个属性都有自己的名称和取值,具体示例如下:
<售价 单位="元">68</售价>

需要注意的是,在XML文档中,属性的命名规范同元素相同,属性值必须要用双引号(“”)或者单引号(‘’)引起来,否则被视为错误。

属性还可以通过子元素的形式来描述同样的信息,将属性定义的示例代码改写为以下代码,具体如下:
<售价>
    <价格>68</价格>
    <单位>元</单位>
</售价>

注释

被注释的内容会被程序忽略而不被解析和处理
XML注释和HTML注释写法基本一致,具体语法格式如下所示:
<!--注释信息-->

注意:
1、注释不能出现在XML声明之前,XML声明必须是文档的第一行
2、注释不能出现在标记中
3、字符串“--”不能在注释中出现
4、在XML中,不允许注释以“--->”结尾
5、注释不能嵌套使用,因为第一个“<!--”会匹配在它后面第一次出现的“-->”作为一个完整的释符

特殊字符处理


在XML文档中,表示这些特殊字符的转义字符序列称为预定义实体。
&:&armp、<:&lt、>:&gt、":quot、':apos

CDATA区

Character Data的简写,即字符数据,CDATA区指的是不想被程序解析的一段原始数据,它以“<![CDATA[”开始,以“]]>”结束。

特殊字符出现在该区中不用使用转换字符,提高了xml文档的可读性

DTD约束

什么是约束

在XML文档中,定义了一套规则来对文档中的内容作出限制约束,这套约束称为XML约束。

DTD约束

最常用的两种约束语言是DTD约束和Schema约束。
DTD约束是早期出现的一种XML约束模式语言,根据它的语法创建的文件称为DTD文件。

在一个DTD文件中,可以包含元素的定义、元素之间关系的定义、元素属性的定义以及实体和符号的定义。
使用DTD文件约束XML文档,必须在XML文档中引入DTD文件。在XML文档中引入外部DTD文件有两种方式: 
(1)<!DOCTYPE 根元素名称 SYSTEM  "外部DTD文件的URI">
(2)<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "外部DTD文件的URI">

DTD语法

文档声明


1.内部DTD,在XML文档内部嵌入DTD,只对当前 XML有效。
2.外部 DTD一本地 DTD ,DTD文档在本地系统上,公司内部自己项目使用 。
3.外部DTD一公共DTD ,DTD 文挡在网络上, 一般都有框架提供 。

元素定义


在DTD定义中,每一条<!ELEMENT…>语句用于定义一个元素,其基本的语法格式如下所示:
<!ELEMENT 元素名称 元素内容>

“元素内容”共有五种内容形式,具体如下:
(1)#PCDATA:表示元素中嵌套的内容是普通文本字符串
(2)子元素:说明元素包含的元素
(3)混合内容:表示元素既可以包含字符数据,也可以包含子元素
(4)EMPTY:表示该元素既不包含字符数据,也不包含子元素,是一个空元素
(5)ANY:表示该元素可以包含任何的字符数据和子元素

在定义元素时,“元素内容”中可以包含一些符号,其中常见的符号具体如下:
问号[?]:表示该对象可以出现0次或1次。
星号[*]:表示该对象可以出现0次或多次。
加号[+]:表示该对象可以出现1次或多次。
竖线[|]:表示列出的对象中选择1个。
逗号[,]:表示对象必须按照指定的顺序出现。
括号[()]:用于给元素进行分组。

属性定义

设置说明
定义元素的属性时,有四种设置说明可以选择,具体如下:
1)#REQUIRED:表示元素的该属性是必须的
2)#IMPLIED:表示元素可以包含该属性,也可以不包含该属性
3)#FIXED:表示一个固定的属性默认值,在XML文档中不能将该属性设置为其它值。
4)默认值:和FIXED一样,如果元素不包含该属性,该属性将被自动设置为DTD中定义的默认值

属性类型
1)CDATA
这是最常用的一种属性类型,表明属性类型是字符数据,与元素内容说明中的#PCDATA相同。
2)Enumerated(枚举类型)
在声明属性时,可以限制属性的取值只能从一个列表中选择,这类属性属于Enumerated(枚举类型)。需要注意的是,在DTD定义中并不会出现关键字Enumerated。
3)ID
一个ID类型的属性用于唯一标识XML文档中的一个元素。其属性值必须遵守XML名称定义的规则。一个元素只能有一个ID类型的属性,而且ID类型的属性必须设置为#IMPLIED或#REQUIRED。
4)IDREF和IDREFS
5)NMTOKEN和NMTOKENS
NMTOKEN是Name Token的简写,它表示由一个或者多个字母、数字、句点(.)、连字号(-)或下划线(_)所组成的一个名称。NMTOKENS关键字表示一种列表类型。一个元素的NMOTOKENS类型的属性设置值可以是同一个XML文件中的另外多个NMTOKEN类型的属性的设置值,每个NMTOKEN属性值之间用空格分隔。
6)NOTATION
通过设置NOTATION类型的属性来让一个外部应用程序进行处理。在DTD文件中,NOTATION定义语句分为两种情况,具体如下:
第一种情况:<!NOTATION 符号名 SYSTEM "MIME类型">
第二种情况:<!NOTATION 符号名 SYSTEM "URL路径名">
7)ENTITY和ENTITYS
ENTITY对应的中文意思为实体,当某个属性的类型设置为ENTITY时,表明其属性值必须为在DTD中使用<!ENTITY …>语句定义的一个实体(entity)的引用。

实体定义

引用实体
引用实体的定义方式如下所示:
(1)<!ENTITY 实体名称 "实体内容">
(2)<!ENTITY 实体名称 SYSTEM "外部XML文档的URL">

引用实体用于解决XML文档中内容重复的问题,其引用方式方法为:
&实体名称;

参数实体
参数实体只能被DTD文件自身使用,它的语法格式如下所示:
<!ENTITY % 实体名称 "实体内容">
注意:在声明参数实体时,ENTITY、%、实体名和“实体内容”之间各有一个空格。
引用参数实体的方式是:%实体名称;

Schema约束

什么是Schema约束

XML Schema与DTD比较,具有下列优点:
(1)DTD采用的是非XML语法格式,而XML Schema采用的是XML语法格式,而且它本身也是一种XML文档。
(2)DTD和XML Schema都用于对XML文档进行描述,都被用作验证XML合法性的基础。但是,DTD本身合法性的验证必须采用另外一套机制,而XML Schema则采用与XML文档相同的合法性验证机制。
(3)XML Schema对名称空间支持的非常好,而DTD几乎不支持名称空间。
(4)DTD支持的数据类型非常有限。
(5)DTD定义约束的能力非常有限,无法对XML实例文档作出更细致的语义限制。
(6)Schema是新的XML 文档约束:Schema 要比 DTD 强大很多,是 DTD 替代者 ;

名称空间

什么是命名空间

名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元索和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突。

它可以唯一标识一个元素或者属性。声明名称空间的语法如下所示:
<元素名 xmlns:prefixname="URI">

Schema语法

元素定义


Schema和DTD一样,都可以定义XML文档中的元素。在Schema文档中,元素定义的语法格式如下所示:
<xs:element name="xxx" type="yyy"/>

element用于声明一个元素,xxx指的是元素的名称,yyy 指元素的数据类型。

在XML Schema 中有很多内建的数据类型,其中最常用的有以下几种: 
xs:string:表示字符串类型
xs:decimal:表示小数类型
xs:integer:表示整数类型
xs:boolean:表示布尔类型
xs:date:表示日期类型
xs:time:表示时间类型

XML的示例代码,具体示例如下:
<lastname>Smith</lastname>
<age>28</age>
<dateborn>1980-03-27</dateborn>
这三个元素对应的Schema定义如下所示:
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>

属性定义


在Schema文档中,属性定义的语法格式如下所示:
<xs:attribute name="xxx" type="yyy"/>
element用于声明一个元素,xxx指的是元素的名称,yyy 指元素的数据类型。

XML的简单例子,具体示例如下所示:
<lastname lang="EN">Smith</lastname>
应的Schema定义方式如下所示:
<xs:attribute name="lang" type="xs:string"/>

简单类型


(1)xs:minInclusive和xs:maxInclusive元素对值的限定

(2)xs:enumeration元素对一组值的限定

(3)xs:pattern元素对一系列值的限定

(4)xs:restriction元素对空白字符的限定
如果需要对空白字符(whitespace characters)进行处理,可以使用 whiteSpace元素。whiteSpace元素有三个属性值可以设定,分别是preserve、replace和collapse。

复杂类型


(1)空元素
指的不包含内容,只包含属性的元素,具体示例如下:
<product prodid="1345" />
(2)包含其它元素的元素
(3)仅包含文本的元素
(4)包含元素和文本的元素

dom4j

XML解析概述

当将数据存储在XML后 ,我们就希望通过程序获得XML的内容。如果我们使用 Java 基础所学习的IO知识是可以完成的 ,不过你需要非常繁琐的操作才可以完成,且开发中会遇到不同问题 (只读、读写)。人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作 XML。

解析方式和解析器

开发中比较常见的解析方式有三种,如下 :
1. DOM: 要求解析器把整个XML文档装载到内存,并解析成一个Document 对象 。
a) 优点:元素与元素之间保留结构关系,故可以进行增删改查操作 。
b) 缺点: XML文档过大,可能出现内存溢出显现 。
2. SAX: 是一种速度更快,更有效的方法,它逐行扫描文档,一边扫描一边解析 。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件.
a) 优点 : 处理速度快,可 以处理大文件
b) 缺点 : 只能读 ,逐行后将释放资源 。
3.PULL: Android内置的XML解析方式,类似 SAX.
解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包 。

DOM解析原理及结构模型

XML DOM和HTML DOM 类似,XMLDOM 将整个XML文档加载到内存,生成一个 DOM 树,并获得一个Document对象,通过Document对象就可以对 DOM 进行操作.

DOM 中的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点!

API使用
1.如果需要使用dom4j,必须导入jar包。
2.dom4j必须使用核心类SaxReader加载xml文档获得 Document,通过Document对象获得文档的根元素,然后就可以操作了

Java精选笔记_XML基础的更多相关文章

  1. Java学习笔记之---基础语法

    Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...

  2. java学习笔记之基础篇

    java选择语句之switch   //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...

  3. Java精选笔记_Java编程基础

    Java的基本语法 Java代码的基本格式 修饰符 class 类名 {   程序代码 } 一个Java源文件只定义一个类,不同的类使用不同的源文件定义:将每个源文件中单独定义的类都定义成public ...

  4. Java精选笔记_自定义标签

    自定义标签 自定义标签入门 什么是自定义标签 自定义标签可以有效地将HTML代码与Java代码分离,从而使不懂Java编程的HTML设计人员也可以编写出功能强大的JSP页面 JSP规范中定义了多个用于 ...

  5. Java精选笔记_JSP开发模型

    JSP开发模型 JSP Model JSP Model1简单轻便,适合小型Web项目的快速开发. JSP Model2模型是在JSP Model1的基础上提出的,它提供了更清晰的代码分层,更适用于多人 ...

  6. Java精选笔记_JSP技术

    JSP技术 JSP概述 什么是JSP 在JSP全名是Java Server Page,它是建立在Servlet规范之上的动态网页开发技术. 在JSP文件中,HTML代码与Java代码共同存在,其中,H ...

  7. Java精选笔记_Servlet技术

    Servlet技术 Servlet开发入门 Servlet接口 针对Servlet技术的开发,SUN公司提供了一系列接口和类,其中最重要的是javax.servlet.Servlet接口. Servl ...

  8. Java精选笔记_IO流【File(文件)类、遍历目录下的文件、删除文件及目录】

    File(文件)类 File类用于封装一个路径,该路径可以是从系统盘符开始的绝对路径,也可以是相对于当前目录而言的相对路径 File类内部封装的路径可以指向一个文件,也可以指向一个目录,在使用File ...

  9. Java精选笔记_其他IO流(ObjectInputStream、DataInputStream、PrintStream、标准输入输出流)

    其他IO流 ObjectInputStream和ObjectOutputStream 如果希望永久将对象转为字节数据写入到硬盘上,即对象序列化,可以使用ObjectOutputStream(对象输出流 ...

随机推荐

  1. appium安卓自动化常见问题处理

    appium安卓自动化常见问题处理 1.seesionnotcreatedexception 遇到这个首先确定下jdk需要1.7以上 然后还要确定appium是启动状态,可以cmd重启下appium ...

  2. 【转】Hadoop安全实践

    前言 在2014年初,我们将线上使用的 Hadoop 1.0 集群切换到 Hadoop 2.2.0 稳定版, 与此同时部署了 Hadoop 的安全认证.本文主要介绍在 Hadoop 2.2.0 上部署 ...

  3. html5 canvas实现梦幻的3D刺猬球

    今天要为大家带来一款html5 canvas实现的梦幻的3D刺猬球.页面非常梦幻.效果图如下: 在线预览   源码下载 html代码: <div> <canvas width=&qu ...

  4. ios的一些经验记录2

    1.UITextField 的事件用 valuechanged outlet连接 2.swift 中 struct 和class的self 3.Int 和UInt 4.Gesture 的target ...

  5. linux下getrlimit与sysconf函数

    #include <stdio.h> #include <sys/time.h> #include <sys/resource.h> int main(int ar ...

  6. mysql初步调试

    第一次这么近距离的接触源码,有点兴奋,又有点不知所措,尼玛随便一个源文件都有几千行,你说怎么看,还有一些数不清的数据结构,函数,类等乱七八糟的东西. 我装的mysql版本是5.7.12,然后运行平台是 ...

  7. C语言 · 分糖果

    历届试题 分糖果   时间限制:1.0s   内存限制:256.0MB      问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一 ...

  8. ubuntu 16.04 上opengl 的安装以及例子程序编译执行

    因为最近在移植 Qt5.7 + opengl , 遇到了难以越过的山峰,没有办法,试着在 ubuntu 16.04上将 opengl 配置以下,记录: 安装相关的库: sudo apt-get ins ...

  9. 细数JDK里的设计模式<转>

    这也是篇老文了,相信很多人也看过.前面那些废话就不翻译了,直接切入正题吧~ 结构型模式: 适配器模式: 用来把一个接口转化成另一个接口. java.util.Arrays#asList() javax ...

  10. [Javascript]右侧悬浮框

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...