XML学习笔记.docx

上传人:b****5 文档编号:12177481 上传时间:2023-04-17 格式:DOCX 页数:22 大小:73.04KB
下载 相关 举报
XML学习笔记.docx_第1页
第1页 / 共22页
XML学习笔记.docx_第2页
第2页 / 共22页
XML学习笔记.docx_第3页
第3页 / 共22页
XML学习笔记.docx_第4页
第4页 / 共22页
XML学习笔记.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

XML学习笔记.docx

《XML学习笔记.docx》由会员分享,可在线阅读,更多相关《XML学习笔记.docx(22页珍藏版)》请在冰豆网上搜索。

XML学习笔记.docx

XML学习笔记

XML学习笔记

Java相关课程系列笔记之五

 

笔记内容说明

XML(范传奇老师主讲,占笔记内容100%);

目录

一、XML基本语法1

1.1XML介绍1

1.2XML元素1

1.3XML属性1

1.4实体引用1

1.5CDATA段2

1.6DTD声明元素2

1.7DTD声明元素:

声明空元素3

1.8DTD声明元素:

含有PCDATA3

1.9DTD声明元素:

带有子元素(子元素列表)的元素3

1.10DTD声明元素:

声明只出现一次的元素4

1.11DTD声明元素:

声明可多次出现的元素4

1.12DTD声明元素:

子元素只能是其中之一的情况4

1.13DTD声明元素:

子元素可以是元素也可以是文本4

1.14DTD声明元素:

总结5

1.15DTD中声明元素的属性5

1.16属性类型5

1.17属性值的约束5

1.18DTD命名空间介绍5

二、Schema简介6

2.1Schema的作用6

2.2Schema文件的扩展名xsd6

三、Java解析XML7

3.1Java与XML共同点7

3.2Java解析XML有两种方式7

3.3JDOM/DOM4J7

3.4DOM解析7

3.5SAX解析7

3.6案例:

使用DOM4J包的核心API解析xml文件7

3.7案例:

使用DOM4J包的核心API写入xml文件9

四、XPath语言11

4.1XPath基本介绍11

4.2使用XPath的好处11

4.3XPath基本语法11

4.4DOM4J对XPath的支持11

五、附db_info.xml文件12

1、XML基本语法

1.1XML介绍

1)XML是可扩展标记语言(EXtensibleMarkupLanguage)。

2)XML是独立于软件和硬件的信息传输工具。

3)XML是以文本的形式存在于一个文本文件中的,一般该文件的后缀名就是“.xml”,例如:

user.xml。

4)XML的设计宗旨是传输信息(尤其是结构比较复杂的数据),而不是显示数据。

5)XML可以描绘树状结构的数据。

因为这个特点,除了传输数据外,更多时候我们使用XML作为配置文件。

6)XML是一种标记语言,很类似HTML。

7)XML标签没有预先定义,需要自行定义标签。

8)XML被设计为具有自我描述性。

9)XML是W3C推荐的标准(W3C,万维网联盟,WorldWideWebConsortium,这个建立于1994年的组织,其宗旨是通过促进通用协议的发展并确保其通用型,以激发web世界的全部潜能)。

10)XML注释:

--注释内容-->

1.2XML元素

1)XML文档包含XML元素。

2)XML元素指的是从开始标签(包含)到结束标签(包含)的部分。

3)元素可包含其他元素(标签嵌套使用)、文本或者两者的混合物。

4)元素也可以拥有属性。

例如:

XML文件内容都是标签,标签是成对出现的。

1.3XML属性

1)XML元素可以在开始标签中包含属性(即属性是在前标签中定义的),属性(Attribute)通常不是用于保存数据的,而是用于设定、描述标签的一些特征,是提供关于元素的额外(附加)信息的。

属性通常提供不属于数据组成部分的信息,但是对需要处理这个元素的应用程序来说却很重要。

◆注意事项:

v属性必须是属性名=属性值的形式。

v元素可以包含元素,但是不能交叉使用!

嵌套关系必须完整。

2)XML属性的属性值必须使用引号,单引号‘’或双引号“”都可以!

如果属性值本身包含双引号,那么有必要使用单引号包围它,或者可以使用实体引用。

例如:

oracleuser="chang的'连接'"id="sss">

3)在标签名的后面可以定义若干个属性,每个属性间应该以空格隔开。

1.4实体引用

为了解决属性值中使用XML中的特殊字符,我们可以使用类似的转义字符去描述。

字符

被替换为

转移字符(实体引用)

<

<

>

>

&

&

'

'

"

"

◆注意事项:

v文本中也不能有特数字符。

v实际上,在属性值中&和<是确认不合法的特殊字符(但>是合法的),必须要转义。

其余的可以不用,但是更好的习惯是遇到这种在XML中有特殊含义的字符时都使用转义去表达。

1.5CDATA段

在某些情况下,我们在xml中要使用大量XML敏感的字符,而我们又不希望逐一的对其进行转移。

这时候使用CDATA段是最理想的。

1)语法格式:

[CDATA[忽略检查的文本]]>

2)在CDATA中将文本的内容写入,那么这段文本内容会被忽略检查,无论里面是否包含XML敏感内容,全部被当作普通的文本去看待。

例如:

[CDATA[

functionsayhello(){alert("hello!

");}

]]>

3)行业内交换数据时要求xml文件格式相同,所以需要大家遵守规范的xml文件格式,比如两份xml文件要有相同的元素嵌套关系、相同的属性定义、相同的元素顺序、元素出现相同的次数等。

如下为两份相同数据,但是结构不同的xml文件,无法交换数据

1.6DTD声明元素

1)在一个DTD中,元素通过元素声明来进行声明(用于声明和约束元素)。

◆注意事项:

XML只允许有一个根标记(根节点)。

2)DTD声明元素语法:

ELEMENT元素名(元素内容)>

ELEMENT元素名元素类别>

◆注意事项:

若使用DTD声明了元素(也可说使用了DTD验证),那么在xml中只能使用被声明过的元素,包括元素下的子元素。

不能使用不在DTD中声明的元素了。

1.7DTD声明元素:

声明空元素

即声明一个空标签,标签中不含有任何内容。

例如:

ELEMENTpageEMPTY>

对应:

◆注意事项:

简写:

通常xml中若没有后标记可以这样作,html中被大量使用。

前提是标签中没内容!

1.8DTD声明元素:

含有PCDATA

定义元素中的内容为文本内容(写什么都可以)。

1)语法:

ELEMENT元素名(#PCDATA)>

例如:

ELEMENTpage(#PCDATA)>

对应:

chang

◆注意事项:

PCDATA是会被解析器解析的文本,这些文本将被解析器检查实体以及标记。

2)这时候page标签中只能出现文本内容,但要注意,该文本内容是需要检查的,就是说不能出现XML敏感字符。

7<0这样不行!

[CDATA[7<0]]>这样可以

1.9DTD声明元素:

带有子元素(子元素列表)的元素

即约束标签中出现标签,或者说约束元素中有子元素。

1)语法:

ELEMENT元素名(子元素1,子元素2,…)>

2)在声明当前元素所包含的子元素时,我们要在下面声明出这些子元素!

例如:

ELEMENTjdbc(oracle,mysql)>

ELEMENToracle(#PCDATA)>

ELEMENTmysql(#PCDATA)>

上面的声明表示有一个叫jdbc的标签,它其中只能包含两个标签,分别是oracle和mysql,而这两个标签也声明了,它们的内容可以是任意文本。

对应:

chang

boooo

◆注意事项:

jdbc标签中oracle和mysql的出现顺序必须与jdbc声明的元素的顺序一致!

错误一:

boooo这样就不行!

chang

错误二:

lalala

ooooo

ooooo这样就不行!

只能出现1次!

1.10DTD声明元素:

声明只出现一次的元素

1)语法:

ELEMENT元素名(子元素名称)>

例如:

ELEMENTpage(prev)>

对应:

3

2)上例声明了prev子元素必须出现一次,并且必须只在“page”元素中出现一次。

1.11DTD声明元素:

声明可多次出现的元素

对于在子元素中出现的次数,DTD也有规范,不支持具体数,但支持量词。

1)子元素可以出现的量词:

0-1

*

0-多次

+

1-多次

例如:

ELEMENTjdbc(oracle?

mysql+)>

◆注意事项:

v使用了以上的量词的话,子元素出现顺序就不是必须一致了。

v没用量词,则子元素必须出现且1次,且出现顺序必须与声明的元素的顺序一致!

1.12DTD声明元素:

子元素只能是其中之一的情况

例如:

ELEMENTsex(man|woman)>

ELEMENTman(#PCDATA)>

ELEMENTwoman(#PCDATA)>

对应:

abc

--标签二选一-->

◆注意事项:

与就是直接用“,”逗号,如

ELEMENTsex(man,woman)>

1.13DTD声明元素:

子元素可以是元素也可以是文本

定义标签中的子元素可以是元素也可以是文本。

例如:

ELEMENTsexANY>

1.14DTD声明元素:

总结

类型名称

类型说明

CDATA

值为字符数据

(en1|en2|...)

值为枚举列表中的一个值

ID

值为唯一的ID

IDREF

值为另外一个元素的ID

IDREFS

值为其他元素ID的列表

NMTOKEN

值为合法的XML名称

NMTOKENS

值为合法的XML名称列表

ENTITY

值是一个实体

ENTITIES

值是一个实体列表

NOTATION

此值是符号的名称

xml

值是一个预定义的XML值

1.15DTD中声明元素的属性

1)在DTD中,属性通过ATTLIST来声明属性。

2)声明属性的语法:

ATTLIST元素名称属性名属性类型默认值>

例如:

ATTLISToracleuserCDATA"user">

--默认值起作用-->

--默认值不起作用-->

◆注意事项:

仅仅是定义元素中的内容为文本内容用#PCDATA,其他地方都用CDATA

例如:

ELEMENTpackage(#PCDATA)>

ELEMENTpackagecolorCDATA"ffffffff">

1.16属性类型

1)CDATA:

文本内容。

2)ID:

属性的值在xml中是唯一的(该属性值不可重复)。

3)枚举(en1|en2…):

属性的值只能是列举的其中之一。

1.17属性值的约束

1)#REQUIRED:

当前这个属性必须在标签里出现(即要写出来),则此时默认值无效了。

例如:

ATTLISToracleuserCDATA"user"#REQUIRED>

2)#FIXED:

属性里的值为固定值(值要给出),或者值是其列举的其中之一。

例如:

ATTLISToracleuserCDATA"user"#FIXED("user"|"admin")>

3)默认值"xxx":

若在默认值位置直接给定值,那么就是默认值。

例如:

ATTLISToracleidCDATA"sss">

1.18DTD命名空间介绍

1)命名空间(NameSpace),XML文件允许自定义标记,所以可能出现来自不同源DTD或Schema文件的同名标记,为了区分这些标记,就需要使用命名空间。

2)命名空间的目的是有效的区分来自不同DTD的相同标记,例如下例xml文件中使用了命名空间区分开“表格”和“桌子”。

例如:

table>

这是一个表格

table>

table>

coffeetable

wood

table>

 

2、Schema简介

2.1Schema的作用

因为DTD无法解决命名冲突问题,所以出现了Schema,它是DTD的替代者。

DTD和Schema的功能都是用于描述XML结构的。

Schema:

W3C提出的一套用于约束XML元素的标准,支持命名空间,和DTD的作用一致。

DTD因为定义语法相对困难,且不是标准的XML形式去描述定义的。

而Schema本身就是xml(所以也被称作是自描述的语言),去约束另一个xml元素的内容相对DTD更易维护。

2.2Schema文件的扩展名xsd

XMLSchemaDifinition(简称XSD,遵循W3C标准)。

3、

Java解析XML

3.1Java与XML共同点

有很多共同点,比如跨平台、与厂商无关,目前为止Java对XML的解析比其他语言更完善(Java是支持XML最好的语言)。

3.2Java解析XML有两种方式

1)DOM:

文本对象模型(DocumentObjectModel)

2)SAX:

基于xml的简单API(SimpleAPIForXML)

3)嵌入式设备中常用SAX进行解析。

例如android中就是使用SAX作为解析xml文件的工具的。

Android中还有一种叫做Pull解析。

3.3JDOM/DOM4J

目前常用的2种解析XML文件的API。

3.4DOM解析

解析XML是以树状结构进行解析的。

DOM在解析XML的时候会将整个xml内容解析出来,以Element(元素)描绘每个节点和嵌套关系,并载入内存。

1)关键字:

树(Document)

2)优点:

把xml文件在内存中构造树型结构,可以遍历和修改节点,因为它知道节点的所有关系。

3)缺点:

因为解析时就将整个xml文件全部载入到内存,所以解析过长,内存开销大。

3.5SAX解析

解析XML是把xml文件作为输入流,触发标记开始,内容开始,标记结束等动作。

1)关键字:

流(Stream)

2)优点:

解析可以立即开始,速度快,没有内存压力。

3)缺点:

不能对节点做修改。

3.6案例:

使用DOM4J包的核心API解析xml文件

我们使用DOM工具,来自DOM4J,非常流行的用于解析xml的DOM工具,还有一种常用的叫做JDOM,解析步骤:

1)创建用于解析Xml文件的读取器SAXReader;

2)使用SAXReader读取指定的输入流来解析xml文件;

3)第2步的方法会返回一个Document对象,描述整个文档,通过该文档对象获取根标签(标记)Root;

4)根据树的组成形式,逐一解析。

step1:

创建DBinfo类,其中属性有

privateStringurl;//连接的urlprivateStringdriver;//连接的驱动

privateStringusername;//数据库用户名privateStringpassword;//数据库密码

privateStringdbName;//数据库连接名privateStringattUser;//数据库标签的属性user

……各自对应的get/set方法

step2:

创建XMLUtils工具类用于解析xml文件(xml文件内容见第五章)属性如下:

/**定义常量,用于描述当前解析的XML中出现的标签名*/

privatestaticfinalStringELEMENT_JDBC="jdbc";

privatestaticfinalStringELEMENT_ORACLE="oracle";

privatestaticfinalStringELEMENT_MYSQL="mysql";

privatestaticfinalStringELEMENT_URL="url";

privatestaticfinalStringELEMENT_DRIVER="driver";

privatestaticfinalStringELEMENT_USERNAME="username";

privatestaticfinalStringELEMENT_PASSWORD="password";

privatestaticfinalStringATTRIBUTE_USER="user";

step3:

在XMLUtils工具类中,添加xmlToDBInfo(InputStreaminput)方法

/**方法xmlToDBInfo:

解析xml文件,将配置的所有数据库连接返回*/

publicstaticListxmlToDBInfo(InputStreaminput){

/**参数InputStreaminput说明:

因为我们要使用DOM去解析XML文件,那么一

定会通过输入流去获取Xml文件中的数据,无论这个文件来自网络还是本地文件,我们在程序中都是通过输入流的形式读取的。

*/

//1使用dom4j需要导包:

dom4j-1.6.1.jar

SAXReaderreader=newSAXReader();

/**解析xml前调用该方法!

该方法默认值为false,设置为true的作用是检查xml的合法性,验证DTD。

*/

reader.setValidation(false);//此处建议先false,否则DTD稍有错误就将报错!

//2导包:

org.dom4j.Document

Documentdocument;

try{document=reader.read(input);//读取并解析文件

}catch(Exceptione){e.printStackTrace();

thrownewRuntimeException("数据读取错误!

",e);}

//3导包:

org.dom4j.Element

/**root.getName()用于获取当前标签的名字,这里应该是jdbc*/

Elementroot=document.getRootElement();

if(!

"jdbc".equals(root.getName())){

thrownewRuntimeException("数据格式错误,根应该是:

"+ELEMENT_JDBC);}

//4逐一解析

/**root.elements();该方法获取root元素下的所有子元素并以集合的形式返回。

*root.element(Stringname);获取指定名字的子元素

*root.elements(Stringname);获取指定名字的所有子元素*/

ListchildList=root.elements();

/**将oracle元素和mysql元素保存的内容存放到相应的DBInfo对象中,再将这些对象存入一个集合并返回,最终完成解析工作。

*/

Listinfos=newArrayList();

for(Elementchild:

childList){

//将oracle或mysql标签转化为DBInfo对象并存入集合infos

DBInfoinfo=toDBInfo(child);infos.add(info);}

returninfos;}

 

step4:

将标签内容转化为DBInfo对象,添加toDBInfo(Elementelement)方法

privatestaticDBInfotoDBInfo(Elementelement){

DBInfoinfo=newDBInfo();

//ElementurlElement=element.element(ELEMENT_URL);//现拿到标签,再拿标签内容

//Stringurl=urlElement.getText();

Stringurl=element.elementText(ELEMENT_URL);//同上面两步,直接获取子元素文本

Stringdriver=element.elementText(ELEMENT_DRIVER);

Stringusername=element.elementText(ELEMENT_USERNAME);

Stringpassword=element.elementText(ELEMENT_PASSWORD);

StringattUser=element.attributeValue(ATTRIBUTE_USER);//获取标签的属性值

StringdbName=element.getName();//获取当前标签的名字

info.setAttUser(attUser);info.setDbName(dbName);

info.setDriver(driver);info.setPassword(password);

info.setUrl(url);info.setUsername(username);

returninfo;}

step5:

测试

FileInputStreamfis=newFileInputStream("src"+File.separator+

"day03"+File.separator+"part2"+File.separator+"db_info.xml");

Listinfos=XMLUtils.xmlToDBInfo(fis);

for(DBInfoinfo:

infos){

System.out.println("db_name:

"+info.getDbName());

System.out.println("url:

"+info

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1