1.XML文档概述
XML(可扩展标记语言 (Extensible Markup Language, XML) )是树状结构的,是一种通用的数据交换格式。
一个XML文档就像数据库中一个表 ,具有三个要素:文档结构、文档数据、文档样式。
2.什么是配置文件
配置文件就是记录应用程序的配置信息的文件。
传统配置文件的格式:
#Db.Properties
DBServer=192.168.0.100
Database=emp
Port=1443
Username=zxx
Password=123
Properties类:
publicclass ConfigLoader {
publicstaticvoid main(String[]args) throws Exception {
Properties properties = new Properties();
/*
* 总结:通过类加载器加载配置文件的时候不要加/,因为类加载器会直接到classpath的根目录下找指定的名称的文件。
* 通过Class对象加载配置文件的时候要加/
*/
//写绝对路径
// properties.load(newFileInputStream("D:\\Java_Develop\\My_Projects\\MDay2\\src\\db.properties"));
//得到类加载器
//如果配置文件是在src的根目录下,写上配置文件的名字,不能加/
properties.load(ConfigLoader.class.getClassLoader().getResourceAsStream("db.properties"));//配置文件不在包下
//如果配置文件是在src的根目录下,写上配置文件的名字,要加/
properties.load(ConfigLoader.class.getResourceAsStream("/db.properties")); //配置文件不在包下
//如果配置文件是在某个包下,则要写上具体的路径,但路径前面不能加/
// properties.load(ConfigLoader.class.getClassLoader().getResourceAsStream("cn/itcast/gz/config/db.properties"));//配置文件在包下
//如果配置文件是在某个包下,通过这种方式加载时,简写时前面不能加/
// properties.load(ConfigLoader.class.getResourceAsStream("/cn/itcast/gz/config/db.properties"));//配置文件在包下
// properties.load(ConfigLoader.class.getResourceAsStream("config/db.properties"));//配置文件在包下
System.out.println(properties);
}
}
3. XML的基本语法
文档声明
元素定义
属性定义
注释
空格和换行的处理
CDATA区
特殊字符
处理指令(processing instruction)
<?xml version="1.0"encoding="UTF-8" standalone="yes"?>
<!--vsersion:xml文档的版本号,目前为1.0
encoding:xml文档内容的编码(Xml内容有编码,文件自身也有编码。
推荐文件内容和自身的编码都用utf-8)
standalone:说明文档是否独立
申明的位置不能换,先版本再编码-->
<!-- 文档申明引用的是那个dtd文件来校验 -->
<!DOCTYPE unspecified PUBLIC "//UNKNOWN/""unknown.dtd">
<persons>
<person id="0001">
<name>张三</name>
<age>23</age>
<sex>男</sex>
<intro>
<!-- CDATA区用<![CDATA[内容]]>来表示,里面的内容被看作普通字符解析 -->
<![CDATA[大家好<!>,我是张三!]]>
</intro>
</person>
</persons>
4. XML的约束模式语言
先后出现的XML约束模式语言有XML DTD、XDR、SOX、XML Schema等等,其中应用最广泛和具有代表意义的是XML DTD和XML Schema。( 约束模式其实是一种语言。)
4.1 DTD(Document Type Definition)
1)创建dtd文件
DTD文件应该使用UTF-8或Unicode编码。
一个元素的各个组成成份之间可以有各种关系:
<!ELEMENT MYFILE (TITLE AUTHOR EMAIL)>这种是错的,无法表示无序,只穷举
<!ELEMENT MYFILE(TITLE,AUTHOR,EMAIL)>:顺序关系
<!ELEMENT MYFILE(TITLE|AUTHOR|EMAIL)>:互斥关系
在元素的使用规则中可以定义子元素出现的次数:
(书+)>=1、 (书?)0||1、 (书*)>=0、 (书)=1
一对圆括号( )可用于将括在其中的内容组合成一个可统一操作的分组,分组中可以嵌套更小的分组。
<!ELEMENTMYFILE((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
#REQUIRED:该属性必须存在
#IMPLIED:属性不是必需的
#FIXED value:属性值是固定的,直接使用默认值
在使用()分组时,必须遵循以下规范:
a、#PCDATA关键字必须是圆括号中的第一项;
b、在圆括号中可以使用短竖线,但不能使用逗号、问号或加号;
c、在圆括号中虽然使用了短竖线,但并不表明各个并列项之间存在互斥关系;
d、在分组之后必须包含*号,声明0个或多个
<!ENTITY % version '(DOTA_ALLSTARS_v6.69|DOTA_ALLSTARS_v6.69B)'>
<!--+说明可以有1个或多个hero元素,定义元素用ELEMENT-->
<!ELEMENT dota (hero+)>
<!--括号的内容说明,hero元素下有三个元素,且顺序是按照定义的顺序-->
<!ELEMENT hero (strength,agility,intelligence)>
<!--定义元素中的属性用ATTLIST,#REQUIRED表示该属性是必须的, #IMPLIED表示该属性是可选的-->
<!ATTLIST hero version%version; #REQUIRED>
<!ATTLIST hero name CDATA #IMPLIED>
<!--(54|34)表示该属性的值只能是其中一个 -->
<!ATTLIST hero age (54|34) #REQUIRED>
<!--ID表示该属性是ID类型的,与属性名字无关-->
<!ATTLIST hero id ID #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT strength (#PCDATA)>
<!ELEMENT agility (#PCDATA)>
<!ELEMENT intelligence (#PCDATA)>
2)引入dtd文件
一个xml只能引入一个dtd对其进行约束。
在xml文件中引入dtd文件语法如下:
XML文档通过使用 DOCTYPE 声明语句(文档类型定义语句)来指明它所遵循的DTD文件,DOCTYPE 声明语句紧跟在XML文档声明语句后面,有两种格式:
(1)<!DOCTYPE 文档类型名称[xml的根标签] SYSTEM "DTD文件的URL">
(2)<!DOCTYPE 文档类型名称[xml的根标签] PUBLIC "DTD名称" "DTD文件的URL">
例如:
(1)<!DOCTYPE dota SYSTEM "heros.dtd">
(2)<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
扩展:DTD标识名称应符合一些标准的规定,对于ISO标准的DTD以 ISO 三个字母开头;被改进的非ISO标准的DTD以加号“+”开头;未被改进的非ISO标准的DTD以减号“-”开头。
4.2 XML Schema
DTD的缺陷:
1,DTD本身不是一个xml,不能被直接校验
2,不能表示数据类型
3,无法有效处理重名的元素
4,无法定义更多的元素规则
5,无法使用多个DTD文件一起验证
XMLSchema 文件自身就是一个XML文件,但它的扩展名通常为.xsd。
创建xml schema文件:
<?xml version="1.0"encoding="UTF-8"?>
<!--
targetNamespace: 当前Schema中定义的元素都定义在这个名称空间中
xmlns:tns : 给当前名称空间起了一个别名
elementFormDefault:elementFormDefault元素用于指定,该schema文档中声明的根元素及其所有子元素都属于targetNamespace所指定的名称空间
xml:ns: 指定当前schema中使用的元素都来自于http://www.w3.org/2001/XMLSchema里面定义的元素
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://gz.itcast.xml/heros"
xmlns:tns="http://gz.itcast.xml/heros"
elementFormDefault="qualified">
<element name="dota"type="tns:dota"></element>
<complexType name="dota">
<sequence maxOccurs="unbounded">
<element name="hero"type="tns:hero" />
</sequence>
</complexType>
<complexType name="hero">
<sequence>
<element name="strength"type="string" />
<element name="agility"type="string" />
<element name="intelligence"type="string" />
<any></any>
</sequence>
<attribute name="name"type="string" use="required"/>
</complexType>
</schema>
使用xml schema文件约束xml文档:
<?xml version="1.0"encoding="UTF-8"?>
<!--
1.xmlns: 当前xml中的元素来自于http://gz.itcast.xml/heros命名空间
2.xsi:schemaLocation指定该http://gz.itcast.xml/heros名称空间所对应的schema文件。
3.xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 任意的xml schema约束的xml文件中都有的这句话。
-->
<dota xmlns="http://gz.itcast.xml/heros"
xmlns:sn="http://gz.itcast.xml/heros1" //红色为前缀名
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://gz.itcast.xml/herosheros.xsd
http://gz.itcast.xml/heros1 heros2.xsd">
<hero name="Sven">
<strength>23+2.7</strength>
<agility>21+2</agility>
<intelligence>14+1.3</intelligence>
<sn:hero>xcxx</sn:hero>//红色为前缀名
</hero>
</dota>
5.XML编程
XML解析方式分为两种:dom和sax
dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。
sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
参见:
6.附录
1)如何在xml中引入外部的dtd, dtd上面的声明都是指向网络上面dtd文件的地址,因为我们不能够上网,无法让eclipse帮我从网络上面下载dtd,所以需要将网络地址映射到本地dtd地址上面从而对xml进行验证。
2)如何映射
2.1 在抒写xml之前要把dtd文件中的xml生命拷贝到当前xml中
<!DOCTYPEhibernate-configuration PUBLIC
"-//Hibernate/HibernateConfiguration DTD 3.0//EN" dtd的ID
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">网络地址
2.2 在eclipse中
a.通过网络地址映射本地dtd
window---preferences---xml---xmlCatalog--Add
Location中填写本地dtd文件的地址
KeyType中选择URI
key中填写网络dtd的地址
b.通过xml声明中dtd的id
window---preferences---xml---xmlCatalog--Add
Location中填写本地dtd文件的地址
Key Type中选择Public ID
key中填写dtd的Id