您的位置:首页 > 其它

J2EE进阶之XML DTD约束和JAXP的DOM解析 六

2017-07-17 15:09 281 查看

XML DTD约束和JAXP解析

XML的简介

* 可扩展的标记语言
* 标签是自定义的

* 和HTML类似
* XML是用来传输数据,不是显示数据

* XML的版本:
* XML1.0(使用)    XML1.1(不向下兼容)

* XML的常见应用
* 作为框架的配置文件

* 系统与系统之间进行数据的传输

* json
* webservice    soap    XML


XML的语法

* 文档声明
* <?xml version="1.0" ?>
* 出现在文档的第一行第一列的位置

* 属性:
* version = "1.0"       xml的版本      必须要写的
* encoding="UTF-8"      XML的编码集     可选的
* standalone="yes/no"   代表xml文件是否是独立的   如果是no,不独立,引入外部的文件。(如果不写,没有问题) 可选的

* 乱码
* 产生的原因:保存文件时和打开文件时采用的编码不一致。
* 解决办法:保证保存文件和打开文件编码一致即可。

* 元素(标签)
* 分为开始和结合标签
* 包含标签主体        <abc>文本内容</abc>
* 不包含标签主体   <abc/>

* 不能交叉嵌套
* 只能有一个根节点

* 命名规范
* 区分大小写 错误的:<a></A>
* 不能以数字和中划线开头   错误的:<1a> <-a>
* 不能以(XML xml Xml)  开头
* 元素中不能包含空格和冒号

* 属性
* XML使用双引号或者单引号
* 属性不能重复
* 命名规范和元素相同

* 注释
* 和HTML的注释相同的
* <!-- XML的注释 -->
* 不能嵌套

* 特殊字符
* <     <
* &     &

* >     >
* "     "
* '     '

* CDATA区
* 作用:把中间内容当前普通文本内容
* 语法:
<![CDATA[
文本内容
]]>

* PI(处理指令)(了解)


XML的约束

* 为什么是约束:
<myspring>
<bean>cn.itcast.login</bean>
</myspring>

* 两个概念
* 格式良好的XML
* 有效的XML


DTD

* 快速入门步骤
* 定义元素
* <!ELEMENT 元素名称 元素类型(后指定) >
* 判断元素是复杂还是简单元素
* 如果是简单元素
元素类型(#PCDATA)
* 如果是复杂元素
元素类型(子元素名称)
* 引入XML的文件中
* <!DOCTYPE 根节点 SYSTEM "DTD的地址" >


demo1

DTD代码:

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!ELEMENT 书架 (书)>
3 <!ELEMENT 书 (书名,作者,售价,简介)>
4 <!ELEMENT 书名 (#PCDATA)>
5 <!ELEMENT 作者 (#PCDATA)>
6 <!ELEMENT 售价 (#PCDATA)>
7 <!ELEMENT 简介 (#PCDATA)>


xml文件

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE 书架 SYSTEM "book.dtd">
3
4 <书架>
5     <书>
6         <书名>javaweb开发大全</书名>
7         <作者>hah</作者>
8         <售价>99.8元</售价>
9         <简介>这书不错啊</简介>
10     </书>
11 </书架>


DTD文件与XML文件的关联方式

* 可以在XML的文件的内部编写DTD的代码
* 格式:
<!DOCTYPE 根节点 [
DTD的代码
]>

* 引入本地DTD的文件(经常使用)
* 格式    <!DOCTYPE 根节点 SYSTEM "DTD文件的地址">

* 引入网络的DTD的文件(不常使用)
* <!DOCTYPE 根节点 PUBLIC "DTD文件的名称" "DTD文件的地址">


demo2 为第二种引入方式

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE 书架 [
3     <!ELEMENT 书架 (书)>
4     <!ELEMENT 书 (书名,作者,售价,简介)>
5     <!ELEMENT 书名 (#PCDATA)>
6     <!ELEMENT 作者 (#PCDATA)>
7     <!ELEMENT 售价 (#PCDATA)>
8     <!ELEMENT 简介 (#PCDATA)>
9
10
11 ]>
12
13 <书架>
14     <书>
15         <书名>javaweb开发大全</书名>
16         <作者>hah</作者>
17         <售价>99.8元</售价>
18         <简介>这书不错啊</简介>
19     </书>
20
21 </书架>


DTD的语法

元素定义

* <!ELEMENT 元素名称 元素类型>

* 元素类型
* (#PCDATA)         可解析的字符数据(字符串)
* EMPTY             空的
* ANY               任意的
* (子节点名称)       子节点

* 子元素
* 子元素直接的关系
* ,     子元素是按顺序出现
* |     是或的关系

* 子元素出现的次数
* +     子元素出现1次或多次
* *     子元素出现0次或多次
* ?     子元素出现0次或1次

<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>


属性定义(AttributeList)

* <!ATTLIST 元素名称
属性名称 属性类型 属性约束
属性名称 属性类型 属性约束
>

* 属性类型
* CDATA     字符串
* 枚举        写法:(值1|值2)
* ID        代表唯一的值,不能重复,不能只写数字

* 属性约束
* #REQUIRED     必须出现的
* #IMPLIED      属性是可选的
* #FIXED        固定值 (#FIXED "值")
* 默认值(不常用)


demo

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE 书架 [
3     <!ELEMENT 书架 (书+)>
4     <!ELEMENT 书 (书名,作者,售价,简介)>
5     <!ELEMENT 书名 (#PCDATA)>
6     <!ELEMENT 作者 (#PCDATA)>
7     <!ELEMENT 售价 (#PCDATA)>
8     <!ELEMENT 简介 (#PCDATA)>
9
10     <!ATTLIST 书
11          出版社 CDATA #FIXED "北大出版社"
12         出版日期 (2014-11-7|2014-11-5) #REQUIRED
13         编号 ID #REQUIRED
14     >
15
16     <!ENTITY username "张三">
17
18 ]>
19
20 <书架>
21     <书 编号="b"  出版日期="2014-11-5">
22         <书名>javaweb开发大全</书名>
23         <作者>&username;</作者>
24         <售价>99.8元</售价>
25         <简介>这书不错啊</简介>
26     </书>
27     <书 编号="b2" 出版社="北大出版社" 出版日期="2014-11-7">
28         <书名>葵花宝典</书名>
29         <作者>越不群</作者>
30         <售价>99.8两</售价>
31         <简介>欲练此功...</简介>
32     </书>
33 </书架>


实体定义(用的比较少)

* <!ENTITY 别名 "值">
* 引入该实体 &别名;

* schema

* 区别:


XML的解析

* 解析XML的技术有哪些?
* 解析XML的技术有很多,主要使用DOM和SAX两种技术?
* DOM和SAX的区别:
* DOM解析XML会在加载整个文档到内存中,形成树状结构。
* 缺点:如果文档过大,容易产生内存溢出的问题。
* 优点:可以做增删改的操作

* SAX解析是基于事件驱动和事件处理器的,边读边解析。
* 优点:不会产生内存溢出的问题。
* 缺点:不能做增删改的操作(但是如果使用DOM4J可以做该操作)

* 几种提供解析XML的jar包
* JAXP      SUN提供的      (标准)
* DOM4J DOM4J提供的        (企业应用最多)
* JDOM  JDOM提供的     (不讲)


JAXP的DOM解析demo

xml 文件:

1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <书架>
3     <书>
4         <书名>javaweb开发大全</书名>
5         <作者>班长</作者>
6         <售价>99.8元</售价>
7         <简介>这书不错啊</简介>
8     </书>
9     <书>
10         <书名>葵花宝典</书名>
11         <作者>越不群</作者>
12         <售价>99.8两</售价>
13         <简介>欲练此功...</简介>
14     </书>
15 </书架>


解析:

1 package test;
2
3 import javax.xml.parsers.DocumentBuilder;
4 import javax.xml.parsers.DocumentBuilderFactory;
5 import javax.xml.parsers.ParserConfigurationException;
6 import javax.xml.transform.Transformer;
7 import javax.xml.transform.TransformerFactory;
8 import javax.xml.transform.dom.DOMSource;
9 import javax.xml.transform.stream.StreamResult;
10
11 import org.w3c.dom.Document;
12 import org.w3c.dom.Element;
13 import org.w3c.dom.Node;
14 import org.w3c.dom.NodeList;
15
16 /**
17  *
18  * @author Angus
19  *  Dom解析
20  */
21 public class JaxpDomTest {
22     public static void main(String[] args) {
23         try {
24             run1();
25         } catch (Exception e) {
26             // TODO Auto-generated catch block
27             e.printStackTrace();
28         }
29     }
30
31
32     /**
33      * 添加子节点
34      * 需求:在第二本书下添加子节点
35      * @throws Exception
36      */
37     public static void run2() throws Exception{
38         // 创建解析器对象的工厂
39         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
40         // 获取解析器对象
41         DocumentBuilder builder = factory.newDocumentBuilder();
42         // 解析XML 获取document对象
43         Document document = builder.parse("src/book2.xml");
44         // 创建元素
45         Element cat = document.createElement("猫");
46         // 设置文本
47         cat.setTextContent("我是猫");
48         // 先获取第二本书
49         Node book2 = document.getElementsByTagName("书").item(1);
50         // 把元素添加到书的下面
51         book2.appendChild(cat);
52         // 回写
53         // 获取回写类的工厂
54         TransformerFactory transformerFactory = TransformerFactory.newInstance();
55         // 获取回写类
56         Transformer transformer = transformerFactory.newTransformer();
57         // 进行回写操作
58         transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));
59     }
60     /**
61      * 获取书名的文本内容
62      * @throws Exception
63      */
64     public static void run1() throws Exception{
65         //获取解析器对象工厂类
66         DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
67         //获取解析器对象
68         DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
69         //解析xml文档,返回document对象
70         Document document = documentBuilder.parse("src/book2.xml");
71         //获取书名标签
72         NodeList nodeList = document.getElementsByTagName("书名");
73         //遍历
74         for (int i = 0; i<nodeList.getLength(); i++) {
75             Node node = nodeList.item(i);
76             System.out.println(node.getTextContent());
77             //javaweb开发大全   葵花宝典
78         }
79     }
80 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml j2ee 解析xml