一、Xml历史
(1)gml(通用标记语言,1969)->sgml(标准通用标记语言,1985)->html(超文本标记语言,1993)->xml,extensible markup language (可扩展标记语言,1998)
二、Xml常见应用
(1)解决程序间数据传输
(2)可以做配置文件
(3)充当小型的数据库
三、Xml语法
(1)文档声明:<?xml version="1.0" encoding="gb2312" standalone="yes" ?>
要点:xml声明放在xml文档的第一行
xml声明由以下几个部分组成:
- version--文档符合XML1.0规范;
- encoding--文档字符编码;
- standalone--文档定义是否独立使用;默认为standalone=“no”。
(2)元素:
- XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,标签分为包含标签体(<a>www.sohu.cn</a>)和不含标签体(简写为<a/>)的形式。
- 一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套。
- 每个XML文档必须有且只有一个根元素,根元素是一个完全包括文档中其他所有元素的元素。
- 对于XML标签中出现的所有空格和换行,XML解析程序都会当做标签内容进行处理。
- 命名规范:一个XML元素可以包含字母、数字以及其他一些可见字符。
- 区分大小写,例如,<p>和</p>是两个不同的标记;
- 不能以数字或“_”(下划线)开头;
- 不能包含空格;
- 名称中间不能包含冒号“:”;
(3)属性
- 属性值用双引号(")或单引号(‘)分隔(如果属性值中有 ‘,用 " 分隔;有 " ,用 ‘ 分隔;如果既有 ‘ 又有 " ,则需要使用字符实体);
- 一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">;
- 特定的属性名称在同一个元素标记中只能出现一次;
- 属性值不能包括<,>,&。
(4)注释:<!--这是一个注释-->
- 注释内容中不要出现--;
- 不要把注释放在标签中,可以放在除标签以外的任何地方;
- 注释不能嵌套;
- XML声明之前不能有注释。
(5)CDATA节:用于把整段文本解释为纯字符数据而不是标签的情况,CDATA节中的所有字符都会被当做元素字符数据的常量部分,而不是XML标签。
语法:<![CDATA[。。。。内部字符数据部分。。。。]]>
要点:内部字符数据部分中可以输入任意字符(除]]>外);不能嵌套。CDATA节可用于传递小型图片。
(6)处理指令:processing instruction,简称PI
要点:处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。
四、XML文件约束—dtd
(1)xml文件常用的约束有dtd、schema
(2)dtd(document type definition 文档类型定义)文件一般和xml文件配合使用来约束xml的书写规范。
(3)dtd文档的定义语句、声明及引用:
DTD语法:
元素定义:
<!ELEMENT NAME(节点名) CONTENT>
其中CONTENT取值可以为:
EMPTY:该元素不能包含子元素和文本,但可以有属性(空元素)
ANY:该元素可以包含任何在DTD中定义的元素内容,一般为当前节点名下面所包含的节点名列表
#PCDATA:可以包含任何字符数据,但是不能在其中包含任何子元素其他类型(组合)
修饰符:
eg:
<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
其中#PCDATA表示该节点名内可放任何文本
属性定义语法:
<!ATTLIST 元素名称
属性名称 类型 属性特点
属性名称 类型 属性特点......
>
类型的可取值:
- CDATA 表示属性值可以是任何字符(包括数字和中文)
- ID 表示该属性的取值必须唯一,且不能以数字开头
- IDREF/IDREFS 表示该属性的值指向文档中其它地方声明的ID属性的值,IDREFS表示可有指向多个ID属性的值,用空格进行分隔。
- Enumerated 表示属性的值必须是事先所列出的值的范围内。
eg:<!ATTLIST person 婚姻状况 (single|married|divorced|widowed) #IMPLIED>
- ENTITY/ENTITIES:实体,用于为一段内容创建一个别名,以后在XML文档中就可以使用别名来引用这段内容了。
可分为两种类型:引用实体和参数实体
引用实体:
- 主要用在XML文档中
- 语法格式(dtd中最后定义):
<!ENTITY 实体名称 "实体内容">:在被引用的时候直接转化为实体内容 - 引用方式(xml中引用):&实体名称;
- 使用例子:
<!ENTITY copyright "I am a programmer">
...
©right;
参数实体:
- 被DTD文件自身使用
- 语法格式:
<!ENTITY % 实体名称 "实体内容"> - 引用方式
%实体名称; - 使用例子:
<!------------------第一个例子-------------------><!ENTITY % TAG_NAMES "姓名|EMAIL|电话|地址"> ... <!ELEMENT 个人信息 (%TAG_NAMES;|生日)> <!ELEMENT 客户信息 (%TAG_NAMES;|公司名)> <!---------------第二个例子------------------> <!ENTITY % common.attributes "id ID #IMPLIED account CDATA #REQUIRED" > ... <!ATTLIST purchaseOrder %common.attributes;> <!ATTLIST item %common.attributes;>
属性特点的可取值:
- #REQUIRED 表示必须有该属性值
- #IMPLIED 表示可有可无
- #FIXED value 表示可以没有,但如果有则属性值必须是固定值value eg:<!ATTLIST 姓名 地址 #CDATA #FIXED "北京">
- Default value 表示如果不指定,则默认值为value
声明:
- 内部DTD文档
<!DOCTYPE 根元素 [dtd定义内容]>
- 外部DTD文档
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
- 内外部DTD文档结合
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [内部dtd定义内容]>
引用:xml文件使用DOCTYPE声明语句来指明它所遵循的DTD文件
- 当引用的DTD文件在本地时,采用:
<!DOCTYPE 文档根节点 SYSTEM "DTD文件的本地路径">
- 当引用的DTD文件是一个公共的文件时,采用:
<!DOCTYPE 文档根节点 PUBLIC "DTD名称" "DTD文件的URL">
(4)编程校验XML文档正确性javascript代码)
- 创建xml文档解析器对象
var xmldoc=new ActiveXObject("Microsoft.XMLDOM");
- 开启xml校验
xmldoc.validateOnParse="true";
- 装载xml文档
xmldoc.load("book.xml"); - 获取错误信息(一般用document.writeln(xmldoc.parseError.reason);打印出来)
xmldoc.parseError.reason;
xmldoc.parseError.line;
五、编码问题
ansi:American national standard institute 美国国家标准协会
ansi编码一般为操作系统默认编码,不同国家不一样,可能是gb2312、gbk、big5等,xml文件保存编码格式和文档声明中encoding的编码格式要一致!!!
六、XML编程
1、xml解析技术介绍
分为:dom解析(W3C推出的标准)和sax解析
DOM解析与SAX解析的优缺点:
- 使用DOM解析XML文档时,需要读取整个XML文档,在内存中构建代表整个DOM树的Document对象,从而再对XML文档进行操作。如果XML文档特别大,就会消耗计算机的大量内存,严重的情况下甚至还可能导致内存溢出。
- SAX解析允许在读取文档的时候,即对文档进行处理,不必等到整个文档装载完才对文档进行处理。
解析器:Crimson(sun)、Xerces(ibm捐给apache社区)、Aelfred2(dom4j)
解析API:Jaxp(sun)[dom]、dom4j[dom](性能最好)
2、JAXP介绍
(1)JAXP开发包是J2SE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成。
(2)获得DOM解析器的步骤:
- 调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂;
- 调用工厂对象的newDocumentBuilder方法得到DOM解析器对象;
- 调用DOM解析器对象的parse()方法解析XML文档,得到代表整个文档的Document对象,进行可以利用DOM特性对整个XML文档进行操作了。
3、SAX
(1)sax主要用于对xml文件解析(读取数据),不能去修改、删除、添加元素及属性;
(2)sax技术是一种推的机制,发现内容自动调用相应的监听函数,具体如何处理由程序员自己决定。
4、DOM4j解析技术(效率高,同时可以进行crud操作)
(1)开发dom4j需要引入相应的jar包
(2)获得Document对象:
- 读取XML文件,获得Document对象
SAXReader reader=new SAXReader();
Document document=reader.read(new File("文件路径"));
- 解析XML形式的文本,得到document对象
String text="<members></members>";
Document documet=DocumentHelper.parseText(text);
- 主动创建document对象
Document document=DocumentHelper.createDocument();
//创建根节点
Element root=document.addElement("members");
(3)获得节点对象
- 获得文档的根节点:
Element root=document.getRootElement();
- 取得某个节点的子节点
Element element=node.element("节点名字"); - 取得节点的文字
String text=node.getText();
5、xpath
往往是结合dom4j使用,使用xpath时需要引入jaxen-1.1-beta-6.jar这个jar包;可以方便的访问到xml文档中的某个节点。