1.xml简介
1.extensible Markup Language 可扩展标记型语言
- 标记型语言:html都是使用标签
- 可扩展型语言 html的标签都是固定的,每个标签都有特定的含义
标签可以自己定义 可以写中文标签
<person><person/> - 2.xml用途
html是用于显示数据,xml也可以显示数据(不是主要功能)
xml主要功能,为了存储数据 - 3.xml是w3c组织发布的技术
- 4.xml有两个版本 1.0 1.1
2.xml应用
-
不同的系统之间传输数据
用于表示生活中有关系的数据
经常用在配置文件
如果要修改数据库信息,不需要修改源代码,只需要修改配置文件就可以了
3.xml的语法
1.xml的文档声明
- 创建一个文件后缀名为.xml
- 如果写 xml,必须要有一个文档声明
<?xml version="1.0" encoding="utf-8"?>
文档声明必须写在第一行第一列
属性
version xml 的 版本 1.0
encoding xml 编码 gbk utf-8
standalone 是否需要依赖其他文件
yes/no (不常用)
2.定义元素(标签)标签定义必须有开始,有结束
标签没有内容,可以在标签内结束 例如: <abc/>
标签可以嵌套,必须要合理嵌套
一个 xml中只有一个根标签,其他标签都是都是这个标签下面的标签
xml 中把空格和换行都当成内容来解析
下面两段代码的含义是不相同的
<bb>11111</bb>
<bb>
11111
</bb>
- xml 的命名规则
- 区分大小写
- 不能以数字,下划线开头
- 不能以 xml XML Xml 开头
<xmla>,<XMLb> 这些都不正确 - 不能包含空格和冒号
3.定义属性 - 一个标签上可以有多个属性
<persion id1='aaa' id2='bbb'> </persion>
- 属性名称不能相同
<persion id1='aaa' id1='bbb'> </persion>
错误,不能有两个id1
- 属性名称与属性值之间要用=“属性值”(引号可为单引号或者双引号)
- xml 属性的名称规范和标签的属性规范一致
4.注释
<!-- -->
- 注释不能嵌套
-
注释不能放在第一行,第一行必须放文档声明
5.特殊字符
6.CDATA区
- 可以解决有多个字符都需要转义的操作 if(a<b && b<c && d>f) {}
- 把这些内容放到CDATA区里面,不需要转义
写法
<! [ CDATA [ 内容 ] ] >
把特殊字符当成文本显示
7.PI指令(处理指令)
- 可以在xml中设置样式
写法
<?xml-stylesheet type="text/css" href="name.css"?>
-
设置样式只能对英文标签起作用,对中文标签不起作用。
8.xml语法的总结
- 所有xml元素都必须有关闭标签
- xml标签对大小写敏感
- xml必须正确的嵌套顺序
- xml文档必须有跟元素
- xml的属性必须加引号
- 特殊字符必须转义——CDATA
- xml 中的空格,回车换行会解析是被包留
2.xml的约束
- 为什么需要约束?
比如现在定义一个person的xml文件,只要这个文件里保存人的信息,比如name,age等,但是如果在xml文件中写了一个标签<猫><猫/>,发现可以正常显示,因为符合语法规范但是猫肯定不是人的信息,xml的标签是自定义的需要字数来规定 - xml的约束技术
DTD约束与schema约束
1.DTD快速入门
创建一个文件 后缀名 .dtd
步骤
- 1.看xml中有多少个元素,在dtd文件中写几个<!ELEMENT>
- 2.判断元素是简单元素还是复杂元素
-简单元素:没有子元素
<!ELEMENT 元素名称(#PCDATA)>
-复杂元素:有子元素的元素
<!ELEMENT 元素名称(元素名称)> - 3.需要在xml文件中引入DTD文件
<!DOCTYPE 根元素名称 SYSTEM "DTD文件路径">
打开xml文件使用浏览器打开,浏览器只负责校验xml的语法,不负责校验约束
如果想要校验xml的约束,需要实用工具(myeclipse工具)
创建一个项目 day05
在day05的目录下创建一个xml文件和dtd文件
在xml中引入dtd文件之后多写一个标签之后多写了一个a,会提示出错
DTD的三种引入方式
- 1引入外部dtd文件
<!DOCTYPE 根元素名称 SYSTEM "DTD文件路径">
-
2.使用内部的DTD文件
- 3.使用网络的DTD文件
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的UPL">
-后面学到框架 struts2 使用配置文件 使用外部dtd
使用DTD定义元素
语法
<!ELEMENT 元素名 约束>
- 简单元素 没有子元素的元素
<!ELEMENT 元素名称(#PCDATA)>
(#PCDATA)
:约束name是字符串类型
EMPTY
:元素为空(没有内容)
ANY
:元素可以任意
- 复杂元素:
<!ELEMENT person (name,age,sex,school)>
-子元素只能出现一次
<!ELEMENT 元素名称 (子元素)>
<!ELEMENT person (name+,age?,sex*,school)>
+:表示1次或者多次
?:表示出现0次或者1次
*:表示0次或者多次
子元素直接使用逗号隔开:顺序不可颠倒
子元素直接使用竖线隔开:只能出现子元素中其中一个
使用DTD定义属性
语法
:
<!ATTLIST 元素名称
属性名称 属性类型 属性的约束>
- 属性类型
-CDATA 字符串类型
<!ATTLIST brith
ID1 CDATA #REQUIRED>
-枚举:只能在一定范围内出现值,但是只能每次出现一种值
红路灯的效果
(aa|bb|cc)
<!ATTLIST age
ID2 (AA|BB|CC) #REQUIRED>
-ID:值只能是字母或者下划线开头
<!ATTLIST name
ID3 ID #REQUIRED>
- 属性的约束
#REQUIRED
:属性必须要有
#IMPLIED
:属性可有可无
#FIXED
:表示一个固定的值 #FIXED "ABC"
<!ATTLIST sex
ID4 CDATA #FIXED "XBW">
-直接值
不写属性,使用直接值
写属性,使用写的属性值
<!ATTLIST school
ID5 CDATA "WWW">
实体的定义
语法
:
<!ENTITY 实体名称 "实体的值">
<!ENTITY TEST "NIHAO">
使用实体
:&实体名称;
注意
:一般写在外部dtd文件内
实例
xml解析简介(写到java代码)****
- xml标记型文档
- js使用dom解析标记文档
-根据html的层级结构,在内容中分配一个书型结构,把html的标签,属性和文本都封装成对象
-doucoment element 属性对象 文本对象 属性和文本都封装成对象 -
xml的解析方式(技术):dom 和 sax
- dom方式解析
-根据xml的层级结构在内容中分配一个树形结构,把xml的标签,属性和文本都封装成对象
-缺点:内容过大造成内存溢出
-优点:很方便实现增删改操作 - sax方式解析:
-采用事件驱动,边读边解析
从上到下,一步一步解析,解析到某一个对象,返回对象名
-缺点:不能实现增删改操作
-优点:如果文件过大,不会造成内存溢出,方便实现查询操作
jaxp的dpi的查看
jaxp是javase的一部分
- jaxp解析器在jdk的javax.xml.parse包里面
四个类:分别是针对 dom和 sax 解析使用的类
- dom:
documentBuilder
:解析器类
1.这个类是一个抽象类,不能 new
此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder()
方法获取
2.一个方法,可以解析 xml parse(“xml 路径”)返回是 Document 整个文档
3.返回的 document 是一个接口,父节点是 Node ,如果在 document里面找不到想要的方法,到 Node 里面去找
4.在document
里面方法
getElementsByTagName(String tagname)
——这个方法可以得到标签
返回集合NodeList
createElements(String tagname)
——创建标签
createTextNode(String data)
——创建文本
appendChild(Node oldchild)
——把文本添加到标签下面
removechild(Node oldchild)
——删除节点
getparentNode()
——获取父节点
NodeList
—getLength()
得到集合的长度
—item (int index)
下标取到具体的值
遍历:
for(int i=0;i<list.getLength();i++){
list.item(i);
}
DocumentBuilderFactory:解析器工厂
——这个类也是一个抽象类,不能 new
newInstance () 获取 DocumentBuildertory 的实例。
sax :
SAXParser:解析器类
SAXParserFactory:解析器工厂
使用jaxp查询所有name元素的值
1.创建解析器工厂
DocumentBuilderFactory buliderFactory = DocumentBuilderFactory.newInstance();
2.根据解析器工厂解析解析器
DocumentBuilder builder = builderFactory.newDocumentBilder();
3.解析xml返回document
Document document = bulider.parse("src/person.xml");
4.得到所有的name元素
NodeList list = document.getElementsByTagName("name");
5.遍历集合得到每一个那么元素
for(int i = 0;i<list.getLength();i++){
Node name1 = list.item(i);
String s = name1.getTextContent();
System.out.println(s);
}
使用 jaxp 添加节点
在第一个 p1 下面(末尾) 添加<sex>nv</sex>
步骤:
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析 xml ,返回 document
4.得到第一个 p1
——得到所有 p1 ,使用 item 方法下标得到
5.创建 sex 标签 createTextNode
6.创建文本 createTextNode
7.把文本添加到 sex 下面 appendChild
8.把 sex 添加到第一个 p1 下面 appendChild
9.回写 xml
使用 jaxp 修改节点
修改 第一个 p1 下面的sex内容是nan
步骤:
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析 xml ,返回 document
4.得到 sex item 方法
5.修改sex里面的值 ——setTextContent方法
6.回写 xml
//回写 xml
TransformerFactory transformerFactory=TransformerFactory .newInstance();
Tranaformer transformer=transformerFactory.new Transformer();
transformer .transform(new DOMSource(document),new StreamResult("src/person.xml");
使用 jaxp 删除节点
删除 <sex>nan</sex>节点
步骤:
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析 xml ,返回 document
获取 sex 元素
5.获取 sex 的父节点 使用 getParentNode 方法
6.删除使用父节点 removechild 方法
7.回写 xml
使用 jaxp 遍历节点
步骤:
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析 xml ,返回 document
4.得到根节点
5.得到根节点子节点
6.得到根节点子节点的子节点
遍历的方法:
private static void list1(Node node){
//判断是元素类型的时候才打印
if(node.getNodeType()==Node,ELEMENT_NODE){
System.out.println(node.getNodeName());
}
//得到一层子节点
NodeList list =node.getChildNodes();
//遍历 list
for(int i=0;i<list.getLength();i++)
//得到某一个节点
Node node1 =list.item(i);
//node1.getChildNodes()
list1(node1);
}