XML学习笔记
时间:2016-11-1 00:57
1、XML是指可扩展标记性语言(eXtensible Markup Language),它是一种标记语言,类似于HTML,它被设计的宗旨是传递数据,而非显示数据。
标记型语言:
使用标签来操作。
HTML也是标记型语言。
可扩展:
HTML中的标签是固定的,每个标签都有特定的含义。
XML的标签可以自己定义,也可以写中文的标签。
XML用途:
HTML是用于显示数据,XML也可以显示数据。
XML的主要功能是存储数据。
2、XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。
XML有两个版本:1.0和1.1。
目前使用的都是1.0版本,因为1.1版本不能向下兼容。
3、XML应用
(1)不同的系统之间传输数据。
使用XML保存数据有利于程序的维护。
(2)用来表示生活中有关系的数据。
XML语言出现的根本目的在于描述关系型数据。
XML是一种通用的数据交换格式。
在XML语言中,它允许用户自定义标签,一个标签用于描述一段数据;一个标签可以分为开始标签和结束标签,在这两个标签之间,又可以使用其他标签来描述其他数据,以此来实现数据关系的描述。
XML中的数据必须通过软件程序来解析执行或显示,如IE,这样的解析程序称之为Parser(解析器)。
(3)作为配置文件。
比如现在连接数据库,可以将数据库的用户名和密码写入配置文件,如果需要修改数据库的信息,则不需要修改源代码,修改配置文件即可,有利于程序的维护。
4、XML的语法
(1)XML的文档声明
创建一个文件,扩展名:.xml。
如果想编写XML文件,第一步必须要有一个文档声明(写了文档声明之后,说明该文档是XML文件的内容)
格式:
<?xml version="1.0" encoding="utf-8" ?>(第一个?不允许有空格)
文档声明必须写在第一行第一列。
version:表示XML的版本。
encoding:文档编码,gbk utf-8 iso8859-1(不包含中文)
standalone:说明文档是否独立,即是否依赖其它文档,如standalone="yes"
yes:依赖
no:不依赖
XML的中文乱码问题:
编码格式不统一。
(2)定义元素(标签)
XML元素指XML文件中出现的标签,一个标签分为起始标签和结束标签(不能省略),一个标签有如下几种书写形式:
包含标签主体:<mytag> some content </mytag>
不包含标签主体:<mytag />
一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,不允许有交叉嵌套。
一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或孙标签。
对于XML标签中出现的所有空格和换行,XML解析程序都会当做标签内容进行处理,例如下面两段内容的意义是不一样的:
* <网址>www.baidu.com</网址>
* <网址>
www.baidu.com
</网址>
由于在XML中,空格和换行都作为原始内容(标签)被处理,所以,在编写XML文件时,使用换行和缩进等方式来让源文件中的内容清晰可读的“良好”习惯可能要被迫改变。
一些XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
* 区分大小写,例如<P>和<p>是两个不同的标签
* 不能以数字或下划线开头
* 不能以XML(或xml Xml)开头
* 不能包含空格
* 名字中间不能包含冒号
(3)定义属性
一个元素可以有多个属性,每个属性都有他自己的名称和取值,例如:<mytag name="value" />
属性值一定要用引号(单引号或双引号)括起来。
属性名称的命名规范与元素的命名规范相同。
元素中的属性不允许重复。
在XML技术中,标签属性所代表的信息也可以被改成用子元素的形式来描述,例如:
(4)注释
XML的注释和HTML中的注释是相同的。
在XML声明之前不能有注释,第一行第一列必须是文档声明。
注释不可以嵌套。
(5)特殊字符
对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理:
特殊字符 替代符号
& &
< <
> >
" "
' '
(6)CDATA区
CDATA是Character Data的缩写,作用是将标签当做普通文本内容。
可以解决多个字符都需要转义的操作:if (a > b && c < d) { }
把这些内容放到CDATA区中,就不需要进行转义了。
语法格式:
< ! [ CDATA [
if (a > b && c < d) { } //该内容被当做普通文本,而不是标签。
] ] >
(7)处理指令(PI:Processing Instruction)
作用:用来指挥软件如何解析XML文档。
语法:必须以<?作为开头,以?>作为结尾。
可以在XML中设置样式:
XML声明:<?xml version="1.0" encoding="utf-8" ?>
xml-stylesheet指令:
<?xml-stylesheet type="text/css" href="1.css" ?>
需要注意的是,对中文命名的标签元素无效。
XML文件:
<?xml version="1.0" encoding="UTF-8"?>
CSS文件:
name {
5、XML语法规则总结
所有XML元素都必须关闭标签。
XML标签区分大小写。
XML必须正确的嵌套顺序。
XML文档必须有根元素(只有一个)。
XML的属性值必须加引号。
特殊字符必须转义——CDATA区。
XML中的空格、回车、换行会解析为XML元素。
6、XML的约束之DTD
为什么需要约束?
比如现在定义一个Person的XML文件,只想要这个文件中保存人的信息,比如name、age等,但是如果在XML文件中写了一个标签<cat>,发现也可以正常显示,疑因为符合语法规范,但是cat肯定不是人的信息,XML的标签是自定义的,需要一种约束技术来规定XML中只能出现的元素,这个时候就需要约束。
XML的约束技术:
DTD约束
Schema约束。
7、DTD的快速入门
DTD(Document Type Definition),全称为文档类型定义。
步骤:
(1)创建一个文件,扩展名为:.dtd
(2)看XML中有多少个元素,有几个元素,在DTD文件中就写几个<!ELEMENT>。
(3)判断元素是简单元素还是复杂元素。
复杂元素:有子元素的元素。
<!ELEMENT 元素名称 (子元素) >
简单元素:没有子元素的元素。
<!ELEMENT 元素名称 (#PCDATA) >
(4)在XML文件中引入DTD约束文件
<!DOCTYPE 根元素名称 SYSTEM "DTD文件URL" >
当使用浏览器打开XML文件的时候,浏览器只负责校验语法,而不负责校验约束,如果想要校验XML的约束,则需要使用工具。
使用MyEclipse开发工具:
创建一个项目
在src目录中创建一个XML文件和一个dtd文件
在XML文件中引入dtd文件
在XML文件中则必须遵循dtd约束
该约束只是提示语法错误,如果语法没有错误,则依然可以正常显示。
8、DTD的三种引入方式
(1)引入外部的DTD文件
<!DOCTYPE 根元素名称 SYSTEM "DTD文件URL" >
(2)使用内部的DTD文件
<?xml version="1.0" encoding="UTF-8"?>
(3)使用外部的DTD文件(使用网络的DTD文件)
后面会学到Struts2框架,该框架会使用到外部的DTD文件。
XML使用DOCTYPE声明语句来指明它所遵循的DTD文档,有两种形式:
* 当引用的DTD文档在本地时,采用如下方式:
<!DOCTYPE 根元素 SYSTEM "DTD文件URL" >
* 当引用的DTD文档在公共网络上时,采用如下方式:
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL" >
9、使用DTD定义元素
在DTD文档中使用ELEMENT关键字来声明一个XML元素。
语法:<!ELEMENT 元素名称 使用规则>
使用规则:
(#PCDATA):只是元素的主体内容只能是普通的文本(Parsed Character Data)
EMPTY:用于指示元素的主体为空,比如:<br />
ANY:用于指示元素的主体内容为任意类型。
(子元素):指示元素中包含的子元素。
定义子元素及描述它们的关系:
如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
如:<!ELEMENT FILE (TITLE, AUTHOR, EMAIL) >
如果子元素用 | 分开,说明任选其一:(类似枚举)
如:<!ELEMENT FILE (TITLE | AUTHOR | EMAIL) >
用+、*、?来表示元素出现的次数:
* +:表示至少出现一次,或多次。(至少出现1次)
* * :表示可有可无,可以出现零次、一次或多次。(0次、1次或多次)
* ?:表示可以有也可以无,有的话只能出现一次。(0次或1次)
简单元素:没有子元素的元素。
<!ELEMENT name 使用规则 >
* (#PCDATA):name只能是字符串类型
* EMPTY:name元素的值为空
* ANY:可以是任意元素
复杂元素:
<!ELEMENT 复杂元素 (子元素) >
* <!ELEMENT person (name, age, sex) >
以上子元素只能出现一次。
* <!ELEMENT person (name+, age*, sex?) >
name可以出现一次或多次,至少出现一次。
age可以出现任意次数。
sex可以出现0次或1次。
10、使用DTD定义属性
语法:
<!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
属性值类型:
CDATA:表示属性的取值为普通文本。
ENUMERATED(DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡 | 鸭 | 鱼)
ID:表示属性的取值不能重复,属性的值只能由字母,下划线开始,不能出现空白字符。
属性约束设置说明:
#REQUIRED:表示该属性必须出现。
#IMPLIED:表示该属性可有可无。
#FIXED:表示属性的取值为一个固定值,语法:#FIXED "固定值"。
直接值:表示属性的取值为该默认值。
//为person定义约束
//定义person中只能存在以下五个元素,并且必须按照顺序出现
//定义name值,name元素的值只能为字符串
//定义name的属性
//属性名为ID3,属性类型为ID,约束类型为必须出现
//定义age的属性
//属性名为ID2,只能从枚举类型中选择值,约束类型为必须出现
//定义sex的值,sex的值只能为字符串
//定义sex的属性
//属性名为ID4,属性类型为字符串,属性约束为可有可无
//定义school的值,只能是字符串
//定义school属性
//属性名为ID5,属性值为字符串,固定值为AAAAAA,不能改变
//定义birthday属性
//属性名为ID1,属性类型为字符串,属性约束为必须出现
11、定义引用实体
概念:在DTD中定义,在XML中使用。
语法:
<!ENTITY 实体名称 "实体内容" >
引用方式(注意是在XML中使用):
&实体名称;
注意:
定义实体需要写在内部DTD中,如果写在外部的DTD中,在某些浏览器中无法获取实体对象。
<!DOCTYPE person [
<!ELEMENT person (name) >
<!ELEMENT name (#PCDATA) >
<!ENTITY haha "哈哈" >
]>
<person>
<name>&haha;</name>
</person>
12、XML的解析(Java代码)
如何使用JS解析DOM对象?
根据HTML的层级结构,在内存中分配一个树形结构,把HTML的标签,属性和文本都封装成对象。
Document对象、Element对象、属性对象、文本对象、Node节点对象。
XML的解析方式(技术)分为两种:
DOM和SAX。
DOM解析:
Document Object Model,文档对象模型,这种方式是W3C推荐的处理XML的一种方式。
使用DOM解析的时候,会有一个问题,当文件过大时,会导致内存溢出。
优点是方便实现增删改查操作。
SAX解析:
Simple API for XML,这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
采用事件驱动,边读边解析,从上到下,逐行解析,解析到某一个对象,就把对象的名称返回。
不会造成内存溢出。
可以方便的实现查询,无法实现增删改操作。
XML解析开发包:
JAXP:是SUN公司推出的解析标准实现。
Dom4J:是开源组织推出的解析开发包。
JDom:是开源组织推出的解析开发包。
13、JAXP
JAXP(Java API for XML Processing)开发包是JavaSE的一部分,它由以下几个包及其子包组成:
org.w3c.dom:提供DOM方式解析XML的标准接口。
org.xml.sax:提供SAX方式解析XML的标准接口。
javax.xml:提供了解析XML文档的类。
javax.xml.parsers包中,定义了几个工厂类,可以通过调用这些工厂类,得到对XML文档进行解析的DOM和SAX解析器对象:
DocumentBuilderFactory:
定义工厂API,使应用程序能够从XML文档获取生成DOM对象树的解析器。
这是一个抽象类,可以通过newInstance()方法来获取该类实例。
SAXParserFactory:
定义工厂API,使应用程序能够配置和获取基于SAX的解析器以解析XML文档。
还包含了两个类:
DocumentBuilder:
定义API,使其从XML文档获取DOM文档实例。
这是一个抽象类,其对象可以从DocumentBuilderFactory.newDocumentBuilder()方法获取。
可以通过Document parse(String URL)方法来获取整个Document文档,返回的Document是一个接口,其父接口是Node,Document中找不到的方法,可以到Node接口中去查找。
SAXParser:
定义包装XMLReader实现类的API。
Document中的方法:
NodeList getElementByTagName(String tagName)
返回标签集合。
Element createElement(String tagName)
创建标签。
Text createTextNode(String data)
创建文本。
Node appendChild(Node newChild)
添加标签。
Node removeChild(Node oldNode)
删除节点,并返回oldNode节点。
Node replaceChild(Node newNode, Node oldNode)
替换节点,并返回oldNode节点。
Node getParentNode()
返回此节点的父节点。
String getNodeName()
返回此节点的名称。
short getNodeType()
返回此节点的类型。
String getNodeValue()
返回此节点的值。
Node getFirstChild()
返回此节点的第一个子节点。
Node getLastChild()
返回此节点的最后一个子节点。
Node cloneNode(boolean deep)
返回此节点的副本。
Node getPreviousSibling()
返回此节点之前的兄弟节点。
Node getNextSibling()
返回此节点之后的兄弟节点。
String getTextContent()
此方法返回此节点及其后代的文本内容。
void setTextContent(String content)
设置此节点的文本内容。
boolean hasChildNodes()
返回此节点是否具有任何子节点。
Node insertBefore(Node newNode, Node oldNode)
在oldNode节点之前插入newNode节点。
boolean isEqualNode(Node arg)
测试两个节点是否相等,该方法不仅判断当前节点,还判断当前节点下的子节点。
boolean isSameNode(Node arg)
返回此节点是否是与给定节点相同的节点,例如node1.isSameNode(node1);,则返回true,参数为其他节点则返回false。
NodeList中的方法:
int getLength()
列表中节点的个数。
Node item(int index)
返回集合中的第index个元素。
XML回写类:Transformer类(格式化操作比较弱)
这是一个抽象类,其实例可以通过TransformerFactory.newInstance().newTransformer()方法获取。
在多线程同时运行时不能使用此类的对象。
Transformer可以多次使用,可以在转换之间保留参数和输出属性。
抽象方法:
abstract void transform(Source xmlSource, Result outputTarget)
将XMLSource转换为Result。
可以理解为将内存中的XML树转换为实体文件。
Source接口:
是一个接口,其实现类是DOMSource。
DOMSource类:
DOMSource类不是一个抽象类。
构造方法:
DOMSource(Node node)
创建带有DOM节点的新输入源。
Result接口:
该类是一个接口,其实现类是StreamResult。
StreamResult类:
该类不是一个抽象类。
构造方法:
StreamResult(String systemId)
根据指定URL构造StreamResult。
===============================================================================
14、使用JAXP查询XML文件
(1)查询XML文件中所有的name值
//3、解析XML文件,返回Document对象
------------------------------------------------------------------------------------------------------------------------------
查询XML中第一个name元素的值
===============================================================================
15、使用JAXP添加元素
(1)在第一个p1元素后添加sex元素
===============================================================================
16、使用JAXP修改节点
将第一个p1下的sex元素内容修改为“女”。
===============================================================================
17、使用JAXP删除节点
删除sex节点。
===============================================================================
18、使用JAXP遍历节点
if(node.getNodeType() == Node.ELEMENT_NODE)
{
//打印当前节点名称
System.out.println(tab + "<" + node.getNodeName() + ">");
}
——XML第一天总结
1、表单提交方式
* button提交
form对象的submit方法
* 超链接提交
* 事件
2、XML文档声明和乱码
* 文档声明必须写在第一行第一列
* 乱码需要保持一致
3、XML元素的定义、属性和注释
4、XML的特殊字符
* CDATA
* PI
5、DTD入门简介
* 两种约束:DTD和Schema
6、DTD的引入方式
7、DTD定义元素和属性
8、DTD定义实体以及W3C案例
9、XML的解析及简介
* DOM和SAX的区别
10、JAXP的DOM方式API文档
11、JAXP操作DOM(CRUD)
* 查询
getElementsByTagName()
遍历集合
getLength()
item(index)
得到具体文本
getTextContent()
* 添加
createElement()
createTextNode()
appendChild()
回写XML文件
* 修改
修改文本
setTextContent
回写XML文件
* 删除
获取父节点
getParentNode()
删除节点
removeChild()
* 遍历
使用递归
获取所有子节点(不包含孙节点)
getChildNodes()
——XML第二天
1、Schema约束
XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,其出现的目的是为了克服DTD的局限性。
XML Schema VS DTD:
XML Schema符合XML语法结构。
DOM、SAX等XMLAPI很容易解析XML Schema文档中的内容。
XML Schema对名称空间的支持非常好,所以一个XML文档中可以有多个Schema。
XML Schema比XML DTD支持更多的数据类型,并且支持用户自定义新的数据类型,在DTD中只能定义#PCDATA类型,而在Schema中可以直接定义整数类型。
XML Schema定义约束的能力非常强大,可以对XML实例文档做出细致的语意限制。
XML Schema不能像DTD一样定义实体,Schema比DTD更复杂,已经是W3C组织的标准,正在逐步取代DTD。
2、Schema快速入门
应用Schema约束开发XML过程:
W3C预先定义元素和属性 → Schema文档(模式文档、约束文档) → XML文档(实例文档)
编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,这个URI地址叫做namespace(名称空间),XML就可以通过这个URI(即名称空间)引用绑定指定名称空间的元素。
3、XML Schema文档基本结构
在W3C XML Schema规范中规定:所有的Schema文档都必须使用<schema>作为其根元素:
<?xml version="1.0" ?>
<schema>
......
</schema>
<schema>元素可以包含一些属性,一个XML Schema声明看起来经常以如下的形式出现:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.baidu.com" //可以是任意值
elementFormDefault="qualified" >
xmlns:表示当前XML文件是一个约束文件。
targetNamespace:使用schema约束文件,直接通过这个地址引入约束文件。
elementFormDefault="qualified"
4、编写XML Schema文档
创建一个Schema文件,扩展名是.xsd
* 和XML文件一样,一个XML Schema文档也必须有一个根节点:<schema>
(1)XML文件中有多少个元素,就写多少个ELEMENT
(2)判断是简单元素还是复杂元素
简单元素:指那些仅包含文本的元素,它不会包含任何其他的元素或属性。
复杂元素:复杂类型元素是包含子元素或者属性的元素。
使用<complexType>表示复杂类型元素。
<sequence>标签表示元素为有序元素。
(3)简单元素写在复杂元素中,直接写name值和属性类型即可。
(4)在被约束XML文件中引入约束文件
xmlns="http://www.example.org/1"
表示约束文档中的targetNamespace(名称空间)
test1:schemaLocation="http://www.example.org/1 1.xsd"
targetNamespage 空格 约束文档的路径
5、XML Schema复杂元素指示器
All:表示元素只能出现一次
Choice:表示元素只能出现其中一个。
Sequence:元素必须按照顺序出现。
maxOccurs="unbounded":表示出现次数没有限制。
<element name="name" type="node" maxOccurs="unbounded" />
定义属性(必须是复杂元素):
需要写在</complexType>标签的前面。
<attribute name="p1" type="string" use="required" > </attribute>
use表示属性是否必须出现。
<any> </any>:表示任意元素。
6、复杂Schema示例
company.xml
<?xml version="1.0" encoding="utf-8" ?>
<!-- 数文件 引入多个Schema文件 -->
<company xmls = "http://www.example.org/company"
xmls:dept = "http://www.example.org/department"
xmls:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/company conpany.xsd http://www.orgexample.org/department department.xsd"
>
<employee age="30" >
<!-- 部门名称 -->
<dept:name>100</dept:name>
<!-- 员工名称 -->
<name>王一</name>
</employee>
<company>
company.xsd
<?xml version="1.0" encoding="utf-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/company"
elementFormDefault="qualified"
>
<element name="company">
<complexType>
<sequence>
<element name="employee" >
<complexType>
<sequence>
<!-- 引用任何一个元素 -->
<any></any>
<!-- 员工名称 -->
<element name="name"></element>
</sequence>
<!-- 为employee元素添加属性 -->
<attribute name="age" type="int" ></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
department.xsd
<?xml version="1.0" encoding="utf-8" ?>
<schema xmls="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/department"
elementFormDefault="qualified"
>
</schema>
7、使用默认名称空间
基本格式:
xmln="URI";
举例:
<书架 xmlns="http://www.baidu.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:shcemaLocation="http://www.baidu.com bool.xsd"
>
<书>
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价>28.00元</售价>
</书>
</书架>
8、SAX解析的原理
解析XML有两种技术:DOM和SAX。
DOM解析:
根据XML的层级结构,在内存中分配一个树形结构。
把XML中的标签、属性、文本都封装成对象,然后通过对象的方法进行操作。
SAX解析:
事件驱动,边读边解析。
无法对节点实现增删改操作
在javax.xml.parsers包中:
* SAXParser类
该类是一个抽象类,该类的实例可以通过SAXParserFactory.newSAXParser()方法获得。
方法:
void parse(File f, DefaultHandler dh)
使用指定的DefaultHandler将指定文件的内容解析为XML。
File f:XML文件的路径
DefaultHandler:事件处理器
把事件处理器当做参数传递之后,相当于在方法中绑定了一个事件。
当执行方法后,会自动执行事件。
* SAXParserFactory类
该类是一个抽象类,该类的实例可以通过newInstance()方法获得。
* DefaultHandler类
void startElement(String uri, String localName, String qName, Attributes attributes)
接收元素开始的通知。
当使用SAX解析到<开始标签>的时候,会自动执行startElement()方法。
参数:
qName:当方法执行时,会把当前标签名称返回(qName)。
attributes:当方法执行时,会把当前标签属性返回(attributes)。
void endElement(String uri, String localName, String qName)
接收文档结束的通知。
当SAX解析到<结束标签>时,会自动执行endElement()方法。
参数:
qName:返回标签名称。
void characters(char[] ch, int start, int length)
接收元素中字符数据的通知。
当SAX解析到文本时,会自动执行characters()方法。
该方法接收的参数是String构造方法的参数。
DefaultHandler类中的方法都是自动执行的:
当解析到开始标签时,会执行startElement()方法,参数qName:返回标签内容。
当解析到文本内容时,执行characters()方法,通过String的构造方法返回文本内容。
当解析到结束标签时,会执行endElement()方法,参数qName:返回标签名称。
===============================================================================
9、使用JAXP的SAX方式解析XML文档
SAX解析方式不能实现增删改操作,只能实现查询操作。
打印出整个文档的元素:
执行parse方法,第一个参数是XML文件的路径,第二个参数是事件处理器。
需要手动创建一个事件处理器:
继承DefaultHandler类。
重写三个方法。
------------------------------------------------------------------------------------------------------------------------------
实现获取所有name元素的值。
* 定义一个成员变量 boolean flag = false;
* 判断开始方法是否是name元素,如果是name元素,则把falg设置为true。
* 如果flag的值是true,则在characters方法中打印文本内容。
* 当执行到结束方法时,把flag设置为false,也可以在打印完文本之后设置为false。
------------------------------------------------------------------------------------------------------------------------------
获取第一个name的值。
* 定义一个成员变量:int index = 1;
* 在结束方法时,index++;
* 想要打印第一个name元素的值,需要在characters方法中进行判断。
if (flag == true && index == 1)
===============================================================================
10、使用dom4j解析XML文档
dom4j是一个组织,针对XML解析,提供解析器。
dom4j不是JavaSE的一部分,如果想要使用dom4j中的方法,需要导入dom4j的jar包
方法:
得到Dcument对象:
SAXReader reader = new SAXReader();
Document doc = reader.read(url);
Document的父接口是Node接口,如果在Document中找不到想要的方法,可以去Node中去查找。
Element getRootElement()
获取根节点。
Element是一个接口,它的父接口是Node接口。
Node接口中的方法:
Element addElement(String name)
添加元素。
String getName()
返回此节点的名称。
short getNodeType()
返回此节点类型。
Element getParent()
返回父节点。
String getText()
返回此节点的文本。
boolean hasContent()
判断此节点是否包含子节点或文本节点。
void setName(String name)
设置节点名称。
void setText()
设置节点文本。
Node detach()
自己删除自己,并返回当前节点。
Element中的方法:
void add(Attribute attribute)
添加属性。
void addText(Text text)
添加文本对象。
Element element(QName qName)
获取标签下的一个子标签。
参数:qName表示标签的名称。
Element element()
返回第一个子标签。
boolean remove(ELement)
删除节点,成功返回true,失败返回false。
String attributeValue(属性名称)
获取属性。
List elements()
获取标签下一级的所有子标签。
List elements(QName qName)
获取标签下一级标签名为qName的所有子标签。
参数:qName表示标签名称。
List elements(String name)
===============================================================================
11、使用dom4j查询XML文档
查询name元素中的值。
* getRootElement(),返回Element对象。
* element("p1"),返回List集合。
* 遍历List,得到每一个p1标签。
* 在p1中执行element("name")方法。
* getText()得到name元素中的值。
------------------------------------------------------------------------------------------------------------------------------
查询第二个name元素中的值。
SAXReader reader = new SAXReader();
------------------------------------------------------------------------------------------------------------------------------
获取第一个name元素中的值。
* element("p1"),返回Element
* element("name"),返回Element
* getText(),返回文本
===============================================================================
12、使用dom4j实现添加操作
在第二个p1标签末尾添加一个<sex>男</sex>元素
===============================================================================
13、在指定位置添加节点
在第一个age之前插入<school>清华大学</school>节点。
===============================================================================
14、使用dom4j实现修改节点的操作。
将第一个p标签下的age元素的文本修改为30。
===============================================================================
15、使用dom4j实现删除节点的操作
===============================================================================
16、使用dom4j获取属性。
获取name中的id属性。
===============================================================================
17、使用dom4j支持XPATH的操作
XPATH可以直接获取到某个元素。
第一种形式:
/AAA/BBB/CCC:表示一层一层的,获取AAA下面的BBB下面的CCC元素。
第二种形式:
//BBB:表示得到全部的BBB元素。
第三种形式:
/*:表示全部元素。
第四种形式:
BBB[1]:表示第一个BBB元素
BBB[last()]:表示最后一个BBB元素
第五种形式:
//BBB[@id]:表示获得所有有id属性的BBB元素。
第六种形式:
//BBB[@id='b1']:表示获得所有id属性是b1的BBB元素。
(1)XPATH的第一种书写形式:
层级关系。
/AAA/CCC:
<AAA>
(2)XPATH的第二种书写形式:
如果路径以双斜线开头,则表示选择文档中所有满足双斜线之后的元素(无论层级关系)。
//BBB
<AAA>
选择所有父元素是AAA的BBB元素。
(3)XPATH的第三种书写形式:
/AAA/CCC/DDD/*
选择所有路径依附于/AAA/CCC/DDD/的元素。
/*/*/BBB选择所有的有3个祖先元素的BBB元素。
<BBB></BBB>
</EEE>
//*
选择所有元素
<AAA>
<BBB></BBB>
</EEE>
(4)XPATH的第四种书写形式:
方括号里面的表达式可以进一步的指定元素,其中数字表示元素在选择集中的位置(索引从0开始),而last()函数则表示选择集中的最后一个元素。
/AAA/BBB[1]:
选择AAA的第一个BBB子元素。
/AAA/BBB[last()]:
选择AAA的最后一个BBB子元素。
<BBB></BBB>
(5)XPATH的第五种书写形式。
//@id:
选择所有的id属性
//BBB[@id]:
选择有id属性的BBB元素
(6)XPATH的第六种书写形式。
属性的值可以用来作为选择的准则,normalize-space函数删除了前部和尾部的空格,并把连续的空格串替换为一个单一的空格。
//BBB[@id='b1']:
选择含有id属性且id属性为'b1'的BBB元素。
//BBB[@name='bbb']
18、使用dom4j操作XPATH
默认情况下,dom4j是不支持XPATH的。
如果想要在dom4j使用XPATH,首先需要引入XPATH的jar包。
在dom4j中提供了两个方法,用来支持XPATH:
selectNodes("XPATH表达式")
获取多个节点。
selectSingleNode("XPATH表达式")
获取单个节点。
19、使用XPATH获取所有name元素的值
20、使用XPATH第一个p标签下name元素的值
===============================================================================
21、实现简单的学生管理系统
//获取根节点
//根节点添加stu标签
//stu标签添加id、name、age标签
//id、name、age标签赋值
//获取所有的stu标签
//如果id相等,则打印并退出循环,获取stu对象。
//重新赋值
------------------------------------------------------------------------------------------------------------------------------