web学习笔记之xml

*xml的简介


*eXtensible Markup Language:可扩展标记型语言
**标记型语言:html是标记型语言
xml也使用标签来使用
**可扩展:
html里面的标签是固定的,每个标签都有特定的定义
xml标签可以自己定义,可以写中文的标签
*xml用途
**html是用于显示数据,xml也可以显示数据(不是主要功能)
**xml主要功能,为了存储数据
*xml的应用
*不同的系统之间传输数据
*用来表示生活中有关系的数据
*经常用在配置文件
*xml的语法
(1)xml的文档声明
*创建一个文件 .xml后缀名
*第一步 文档声明 <?xml version="1.0" encoding="utf-8"?>
*文档声明必须在第一行第一列
*属性
version:xml的版本1.0  1.1
encoding:xml编码 gbk utf-8 iso8859-1(不包含中文)
standalone:是否需要依赖其他文件yes/no(不常用)
(2)定义元素(标签)
*例:<person></person>
如果标签内没有内容可以写成<person/>
*标签之间要进行合理嵌套<a><b></b></a>
*一个xml中,只能有一个根标签,其他标签都是这个标签下面的标签
*在xml中把空格和换行都当成内容来解析,例:(下面不同)
<a>123</a>
<a>
123
</a>
(3)定义属性
*例: <person id="12"></person>
一个标签可以定义多个属性,属性名不能相同

(4)注释
*<!-- 注释 -->
(5)特殊字符
常用:< &lt;  > &gt;
与html一样,查文档
(6)CDATA区(了解)
*可以解决多个字符都需要转义的操作
写法:<![CDATA[需要转义的内容]]>
(7)PI指令(了解)
*可以在xml中设置样式
*写法:<?xml-stylesheet type="text/css" href="css文件路径"?>
(8)xml的约束(看懂即可)
dtd约束和schema约束


*创建一个文件 后缀名.dtd
看xml中有多少个元素,有几个元素,再dtd文件中写几个<!ELEMENT>
判断元素是简单元素还是复杂元素
复杂元素:有子元素的元素
<!ELEMENT 元素名称 (子元素)>
-子元素只能出现一次
表示子元素出现的次数(加在子元素后面)
+:表示一次或者多次
?:表示零次或者一次
*:表示零次或者多次
子元素直接使用逗号隔开
表示元素出现的顺序
简单元素:没有子元素的元素
<!ELEMENT 元素名称 (#PCDATA)>
(#PCDATA):约束元素名称是字符串类型
EMPTY:元素为空(没有内容)
ANY:任意
dtd三种引入方式:(1)需要在xml文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">
(2)使用内部dtd文件
<!DOCTYPE 根元素名称[ 里面与dtd文件写法相同 ]>
(3)使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
使用dtd定义属性:
语法:<!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
属性类型:
-CDATA:字符串
-枚举:表示只能在一定的范围内出现值,但是只能每次出现其中的一个
(aa|bb|cc)
-ID:值只能是字母或者下划线开头
<!ATTLIST 元素名称
s ID #REQUIRED
>
属性的约束:
-#REQUIRED:属性必须存在
-#IMPLIED:属性可有可无
-#FIXED:表示一个固定值
属性的值必须是设置的这个固定值
-直接值:不写属性,使用直接值
写了属性,使用设置那个值
<!ATTLIST 元素名称
id CDATA "12SSS"
>
实体的定义
语法:<!ENTITY 实体名称 "实体的值">
例:<!ENTITY TEST "HAHA">
使用实体 &实体名称; 比如:&TEST;
定义实体需要写在内部dtd里面
xml的解析的简介
xml的解析方式(技术):dom和sax
*dom解析方式:
根据xml的层级结构在内存中分配一个树形结构,把xm的标签、属性、文本都封装成对象
缺点:如果文件过大,会造成内存溢出
优点:方便增删改查
*sax方式解析:
采用事件驱动,边读边解析
从上到下,一行一行的解析,解析到某一个对象,返回对象名称
缺点:不能实现增删改操作
优点:如果文件过大,不会造成内存溢出,方便实现查询操作
想要解析xml,首先需要解析器
不同的公司和组织提供了针对dom和sax方式的解析器,通过api方式提供
sun公司提供的解析器 jaxp
dom4j组织提供的解析器 dom4j (***实际开发中最常用)
jdom组织提供的解析器 jdom


jaxp的api的查看
jdk中查看javax.xml.parsers

jaxp解析器四个类:
dom:DocumentBuilder:  解析器类
这个类是抽象类,不能new
此类的实例可以从DocumentBuilderFactory.newDocumentBuilder()方法获取
一个方法,可以解析xml parse("xml的路径"),返回的是Document整个文档

返回的是document是一个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面去找
在document里面方法
getElementsByTagName(String tagname)
--这个方法可以得到标签
--返回的是集合 NodeList
createElement(String tagName)
--创建标签
createTextNode(String data)
--创建文本
appendChild(Node newChild) (父类方法)
--添加方法
getParentNode()
--获取父节点
removeChild(Node oldChild)
--删除节点
getTextContent()
--得到标签里面的内容
setTextContent()
--设置标签里面的内容
NodeList list
-getLength()得到集合长度
-item(int index)下标
for(int i=0;i<list.getLength();i++){list.item(i);}
******与js类似


    DocumentBuilderFactory:   解析器工厂
这个类也是抽象类,不能new
newInstance()获取DocumentBuilderFactory的实例
jaxp实现查询操作(dom)
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析xml返回document
4.获得元素
5.遍历集合
6.得到元素值
jaxp实现添加操作(dom)
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析xml返回document
4.获得元素
5.创建标签和文本进行添加
6.回写xml(下面是实例代码)
TransformerFactory tf=TransformerFactory.newInstance();
Transformer tyu=tf.newTransformer();
tyu.transform(new DOMSource(document),new StreamResult("src/Test.xml"));
jaxp实现修改操作(dom)
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析xml返回document
4.获得元素
5.通过setTextContent()方法设置内容
6.回写xml
jaxp实现删除操作(dom)
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析xml返回document
4.获得元素
5.通过该元素获得父元素
6.通过父元素删除该元素
7.回写xml
sax:SAXParser:解析器类
    SAXParserFactory:   解析器工厂

sax的解析方式
jdk中查看javax.xml.parsers

解析xml有两种技术dom和sax,上面接了dom

sax是根据xml的层级结构再内存中分配一个树形结构,把xml中标签、属性、文本封装成对象
sax方式:事件驱动,边读边解析
javax.xml.parsers包里面
SAXParse
此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得
SAXParserFactory
newInstance() 获取 SAXParserFactory 的一个实例


当解析到开始标签时候,自动执行startElement方法
当解析到文本标签时候,自动执行characters方法
当解析到结束标签时候,自动执行endElement方法

sax方式不能实现增删改操作,只能做查询操作
执行parse方法,第一个参数传xml路径,第二个参数是事件处理器
创建一个类,继承事件处理器的类DefaultHandler
重写里面的三个方法startElement characters endElement

需求:获取xml中某一个元素所有的值
定义一个成员变量 flag=false
判断开始方法是否是这个元素,如果是,flag为true
如果true,在characters方法里面打印内容
当执行结束方法时,把flag改成false


     获取第一个name元素的值
定义一个成员变量 角标
在结束方法时,设置其自增
想要打印出第一个元素的值,在characters方法里面判断,
如果flag为true并且角标为1,再打印内容


使用dom4j解析xml
*dom4j需要先导包。


*得到document
SAXReader reader=new SAXReader();
Document document=reader.read(url);
*document的父接口是Node
如果在document里面找不到想要的方法,去找Node
*document里面的方法 
getRootElement();获取根节点,返回element
*Element也是一个接口,父接口是Node
**getParent();获取父节点
**addElement();添加标签
**element();获取节点
**elements();获取节点,返回list
**attributeValue();获取属性值
DocumentHelper类用来创建元素。

回写xml
*格式化OutputFormat,使用createPrettyPrint方法,表示一个漂亮的格式
*使用类XMLWriter直接new这个类,传递两个参数
第一个参数是xml的文件路径,new FileOutputStream("路径")
第二个参数是格式化类的值
*回写代码XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/NewFile.xml"),OutputFormat.createPrettyPrint());
xmlWriter.write(document);
xmlWriter.close();

需求:在特定位置添加元素。步骤:需要获取该位置的全部元素,用list添加,需要用DocumentHelper类用来创建元素


使用dom4j支持xpath的操作
*可以直接获取元素

第一种形式
AAA/DDD/BBB:表示一层一层的,AAA下面的DDD下面的BBB
第二种形式
//BBB:表示和这个名称相同,表示只要名称是BBB,都得到
第三种形式
//*:所有元素
第四种形式:
BBB[1]:表示第一个BBB元素
BBB[last()]:表示最后一个BBB元素
第五种形式:
//BBB[@id]:表示只要BBB元素上面有id属性,都得到
第六种形式:
//BBB[@id='b1']表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1

使用dom4j支持xpath具体操作
默认的情况下,dom4j不支持xpath
需要导包:jaxen-1.1-beta-7.jar

在dom4j里面提供了两个方法,用来支持xpath
selectNodes(“xpath表达式”)
-获取多个节点
selectSingleNode(“xpath表达式”)
-获取一个节点
使用xpath实现:查询xml中所有name元素的值





schema约束的快速入门
创建一个schema文件 后缀名是.xsd
根节点 <schema>
在schema文件里面schema标签里面
属性 xmlns="http://www.w3.org/2001/XMLSchema"
表示当前xml文件是一个约束文件
targetNamespace="http://www.itcast.cn/20151111"此处可以随意设置
使用schema约束文件,直接通过这个地址引入约束文件
elementFormDefault="qualified"
看xml中有几个元素
<element></element>
判断简单元素和复杂元素
如果复杂
<complexType>
<sequence>
子元素
</sequence>
</complexType>
简单元素
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
在被约束文件里面引入约束文件
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/20151111"
xsi:schemaLocation="http://www.itcast.cn/20151111 1.xsd">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
表示xml是一个被约束文件
xmlns="http://www.itcast.cn/20151111"
是约束文档里面的targetNamespace
xsi:schemaLocation="http://www.itcast.cn/20151111 1.xsd"
targetNamespace 空格 约束文档的路径
在<complexType></complexType>下三个标签的含义
<sequence>表示元素要按顺序出现
<all>表示元素只能出现一次
<choice>表示只能出现其中一个
maxOccurs="unbounded"表示元素出现的次数,此时为无限次
<any></any>表示任意元素

还可以约束属性
写在复杂元素里面
写在</complexType>之前
<attribute name="id" type="int" use="required"></attribute>
name:属性名称
type:属性类型 int string
use:属性是否必须出现
一个xml文件可以引入多个约束文件
在约束文档路径处引入
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值