XML
1.XML介绍
XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言
Html中的标记(标签)是预定义好的
Xml中的标记需要自定义 <name></name>、<猫></猫>
Xml有两个版本1.0 1.1
实际开发用的是1.0, 1.1不能向下兼容
2.xml应用
l Xml主要用于传输数据
l Xml可以表示生活中存在的一些数据关系
l Xml用于配置文件 (web.xml、struts.xml)
3.XML语法
**XML的文档声明
创建XML文件,它的后缀是.xml
文档的声明:<?xml version="1.0" encoding="gb2312"?>,必须放在第一行第一列
***version:表示的是版本号.目前XML有两个版本:1.0和1.1。 1.1版本它不能向下兼容
***encoding:表示的是编码方式GBK、utf-8、ISO8859-1(不支持中文)、gb2312
***standalone:表示是否可以连接外部文件 yes/no。 若值是 ”yes” 表示没有呼叫外部文件,若值是 ”no” 则表示有呼叫外部
注意:保存编码方式要和系统默认的编码方式一致,否则会出现输入中文内容的时候,会出现乱码
**元素(标签)的定义
***元素是成对出现的,有开始就有结束。是大小写敏感的
<name>和<NAME>是不同的两个标签
***元素可以合理嵌套
<person><name></name></person>
***元素不合理嵌套
<person><name></person></name>
***元素不能以数字和下划线(_)开头去定义
<2a></2a>、<_b></_b> 都是不合法的
***元素不能出现xml、XML、Xml等开头
<xml2></xml2>、<XMLR></XMLR>、<Xmlqw></Xmlqw> 都
是不合法的
***元素不能出现空格、特殊字符(:、¥、$、#等)
<a ge>20</a ge>、 <a#ge>20</a#ge> 都是不合法的
*** 以下定义是不同的含义,xml是会把空格、回车符一起解析的
一:<person>张三</person>
二:<person>
张三
<person>
**属性的定义
***XML和HTML一样,标签中都可以定义属性
***XML可以定义多个不同名称的属性。
例子:<person id="per1" name="name1">
<person id="per1" id="name1"> 属性名称相同,不合法
***属性的名称定义规则跟元素名称的一样
**XML的注释
***<!-- -->
***<!-- <!-- --> --> 是不合法的,不允许嵌套注释
**特殊字符
类似于<,>, &, ', "等都需要转译才能使用
**CDATA区
<![CDATA[
&$$$^&*$#@
]]>
可以把要显示的内容放到CDATA区中,这些内容就可以正常显示
**PI指令
可以对xml设置样式
<?xml-stylesheet type="text/css" href="css的路径"?>
注意:不能对中文的标签设置样式
4.XML约束
就是我们在描述事物时,一些本不属于该类事物的属性,单它又符合语法规则,对这类就必须加约束。
XML约束:DTD、Schema
**DTD约束
***首先要创建dtd文件. (XX.dtd),xml中有多少个元素就要在dtd文件中写多少个 <!ELEMENT>
***简单元素: 没有子元素的元素
<!ELEMENT 元素名称 (#PCDATA)>
(1)#PCDATA: 表示内容的是字符串型
(2)ANY: 表示内容是任意的,可以使字符串型,也可以为
空
(3)EMPTY:表示元素内容是空的<age></age>
***复杂元素:有子元素的元素
<!ELEMENT 元素名称 (子元素名称,子元素名称,...)>
(1)"," 逗号表示子元素出现的顺序
(2)"|" 表示子元素只能取其一 (枚举)
(3)"+" 表示子元素有一次或者多次 >=1
(4)"?" 表示子元素有零次或者一次 0,1
(5)"*" 表示子元素有零次、一次或者多次 >=0
***然后就可以在xml文件中引入dtd约束
***DTD约束引入的方式
****外部引入DTD文件的方式
<!DOCTYPE 根元素名称 SYSTEM "路径">
****内部嵌入DTD描述
<!DOCTYPE person [dtd约束的代码]>
例子:<!DOCTYPE person [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
****网络中DTD约束文件
例如 struts2的配置文件struts.xml:
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
DTD属性的定义
语法: <!ATTLIST 元素的名称 属性名称 属性类型 属性的约束>
*属性类型
--CDATA:字符串
<!ATTLIST birthday ID1 CDATA #REQUIRED>
--枚举: 表示只能在一定范围内使用的值,但是每次只能使用其中的一个
例子:(xx|yy|zz)
<!ATTLIST age ID2 (xx|yy|zz) #REQUIRED>
--ID: 表示只能字母或者下划线开头
<!--ATTLIST name ID3 ID #REQUIRED>
*属性约束
--#REQUIRED:属性必须存在
--#IMPLIED: 属性可有可无
--#FIXED:表示一个固定值 #FIXED "xx"
属性值必须是设置的这个固定值
<!ATTLIST sex ID4 CDATA #FIXED "xx"
--直接值
***不写属性值, 使用直接值
***写了属性值,使用设置的值
<!--ATTLIST school ID5 CDATA "www">
DTD实体的定义
语法:<!ENTITY 实体名称 "实体的值">
例子:<!ENTITY TEST1 "hello">
在xml中引用实体是: &TEST1;
例子:<name name1="sdfsd">&TEST1;</name>
注意:实体的定义应该定义在xml内部,使用内部引用。如果定义在dtd文档中,使用外部引用的方式,有可能得不到这个值,存在浏览器兼容的问题
Schema约束
本身就是xml文档,文件后缀名XX.xsd
它的根节点是:<schema></schema>
例子:
(1)创建一个schema文件(qw.xsd)
根节点:<schema xmlns="http://www.w3.org/2001/XMLSchema" (表示当前xml文件是个约束文件)
targetNamespace="http://www.example.org/qw" (表示使用schema约束文件,直接通过这个地址引入约束文件)
xmlns:tns="http://www.example.org/qw" (表示默认的命名空间是:http://www.example.org/qw)
elementFormDefault="qualified"> (表示schema中声明过的元素必须被命名空间限定)
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
</schema>
1.<element>是要看被约束xml文件中有多少个元素(标签),有多少个,这里相应的就应该有多少个<element>
即这里对元素的约束是用<element>标签来表示的
2.看被约束的xml文件中是复杂元素还是简单元素
--复杂元素
<element name="person">
<complexType>
<sequence>
...子元素
</sequence>
</complexType>
</element>
--简单元素
是定义在复杂元素里面的
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element> (简单元素)
<element name="age" type="int"></element> (简单元素)
</sequence>
</complexType>
</element>
**<sequence>:表示子元素出现的顺序
**<all>:表示子元素只能出现一次
**<choice>:表示子元素只能选其一出现
**maxOccurs属性:这个属性加在那个元素中,表示这个元素出现的最大次数(范围:1、unbounded)。如果值是"unbounded"表示次数不限制
**minOccurs属性:这个属性加在那个元素中,表示这个元素出现的最小次数(范围:0、1)。
(2)在被约束的xml文件中的根节点引入qw.xsd约束
<person xmlns:tt="http://www.w3.org/2001/XMLSchema-instance"(表示这是一个被约束文档, 对应qw.xsd中的xmlns内容。但要加"-instance")
xmlns="http://www.example.org/qw" (对应qw.xsd中的targetNamespace里面的内容)
tt:schemaLocation="http://www.example.org/qw qw.xsd">(表示被约束文件是被哪个命名空间下的xsd文件约束。tt是别名)
<name>张三</name>
<age>
</person
SAX方式
***SAXParser:解析类
***SAXParserFactory:解析工厂
sax执行过程
--创建SAXParser对象,通过SAXParser对象中的parse(String uri, DefaultHandler dh)方法执行解析
uri:是xml的相对路径
DefaultHandler:事件驱动器
--然后通过继承DefaultHandler覆写startElement()、characters()、endElement()方法
当解析到开始标签的时候awefaewf,自动执行startElement()方法
当解析到文本的时候,自动执行characters()方法
当解析到结束标签的时候,自动执行endElement()方法
dom4j解析xml
想要解析xml 首先需要解析器
sun公司提供了针对dom和sax解析器 jaxp
dom4j 针对dom和sax解析器 (实际开发中用的最多)
jdom,针对dom和sax解析器 jdom
使用dom4j解析xml
dom4j 是一个组织,针对xml解析,提供解析器dom4j
dom4j不是javase的一部分,所以要有这个第三方的包(dom4j.1.6.1.jar)。
**第一步得到document对象
SAXReader reader = new SAXReader();
Document document = reader.read(url);
**第二步通过document对象的getRootElement()方法获取根节点
Element e1 = (Element) document.getRootElement();
**第三步通过Element对象的element(pname)、elements(pname)、elements()方法定位到某个标签
a.element(qname):表示获取a标签中名称是qname的第一个标签,(qname是标签名称)
a.elements(qname):表示获取a标签中所有名称是qname的同层标签
a.elements():表示获取a标签中所有下一层标签(即只取a标签下面的一层)
**增加一个标签
addElement():添加标签 (在某标签里面最后追加)
list.add(index,element);(在任意位置添加,通过elements获取到list)
**创建一个标签
Element element = DocumentHelper.createElement(“标签名”)
**删除一个标签
fu.remove(zi)(通过父节点去删除子节点)
**获取元素属性的值
attributeValue("属性")
**增加属性和值
addAttribute(name,value);
**增、删、改都需要回写xml
OutputFormat o_format = OutputFormat.createPrettyPrint(); //格式化XMLWriter x_writer = new XMLWriter(newFileOutputStream("src/two.xml"),format);
x_writer.write(document);
x_writer.close();