什么是XML
XML个称为Extensible Markup Language,意思是可扩展的标记语言。
应用常见
配置文件
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
3 <web-app>
4 <servlet>
5 <servlet-name>HelloServlet</servlet-name>
6 <servlet-class>com.oracle.HelloServlet</servlet-class>
7 </servlet>
8 <servlet-mapping>
9 <servlet-name>HelloServlet</servlet-name>
10 <url-pattern>/hello</url-pattern>
11 </servlet-mapping>
12 <welcome-file-list>
13 <welcome-file>index.jsp</welcome-file>
14 </welcome-file-list>
15 </web-app>
存放数据:
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 -<person> 4 5 6 -<person1> 7 8 <name>张三</name> 9 10 <age>18</age> 11 12 </person1> 13 14 <!--这是注释标签 --> 15 16 17 18 -<person2> 19 20 <name>张三</name> 21 22 <age>>18</age> 23 24 -<![CDATA[ 25 if(a>b&&a<b){ 26 a=b; 27 } 28 ]]> 29 </person2> 30 31 </person>
元素命名:
区分大小写
不能使用空格,不能使用冒号:
不建议以XML, xml, Xml开头
格式化良好的XML文档,必须只有一个根元素
什么是DTD
DTD (Document Type Definition ),文档类型定义,用来约束XML文档。
规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!--
3 模拟servlet2.3规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
4 格式如下:
5 <!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
6 -->
7 <!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >
8 <!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file))>
9 <!ELEMENT servlet-mapping (servlet-name,url-pattern+) >
10 <!ELEMENT servlet-name (#PCDATA)>
11 <!ELEMENT servlet-class (#PCDATA)>
12 <!ELEMENT url-pattern (#PCDATA)>
13 <!ELEMENT description (#PCDATA)>
14 <!ELEMENT jsp-file (#PCDATA)>
15
16 <!ELEMENT welcome-file-list (welcome-file+)>
17 <!ELEMENT welcome-file (#PCDATA)>
18
19 <!ATTLIST web-app version CDATA #IMPLIED>
元素声明
定义元素语法:<!ELEMENT元素名 元素描述> 元素名:自定义 元素描述包括 : 符号和数据类型 常见符号: ? * + () | , 常见类型:#PCDATA表示内容是文本,不能是子标签 |
符号 |
符号类型
|
描述 |
示例
|
? |
问号 |
表示该对象可以出现,但只能出现一次 |
(菜鸟?)
|
* |
星号
|
表示该对象允许出现任意多次,也可以是零次 |
(爱好*)
|
+ |
加号
|
表示该对象最少出现一次,可以出现多次 |
(成员+)
|
() |
括号
|
用来给元素分组 |
(古龙|金庸|梁羽生), (王朔|余杰),毛毛
|
| |
竖条
|
表明在列出的对象中选择一个
|
(男人|女人)
|
, |
逗号 |
表示对象必须按指定的顺序出现 |
(西瓜,苹果,香蕉)
|
实例:
1 <!ELEMENT web-app(servlet*,servlet-mapping*,welcome-file-list?)>
2 web-app包括3个标签,且必须顺序出现。
3 servlet子标签个数任意
4 servlet-mapping子标签个数任意
5 welcome-file-list子标签最多只能出现一次
6 <!ELEMENT servlet(servlet-name,description?,(servlet-class|jsp-file))>
7 servlet有3个子标签,且必须顺序出现
8 servlet-name,必须有,且只能出现1次
9 description,可选1次
10 servlet-class和jsp-file二选一,且只能出现一次
11 <!ELEMENT servlet-name(#PCDATA)>
12 servlet-name的标签体必须是文本
13 <!ELEMENT welcome-file-list (welcome-file+)>
14 welcome-file-list至少有1个子标签welcome-file
Schema约束
什么是Schema
Schema是新的XML文档约束:
Schema要比DTD强大很多,是DTD替代者;
Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml .
Schema功能更强大,数据类型更完善
Schema支持名称空间
实例:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app xmlns="http://www.example.org/web-app_2_5"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
5 version="2.5">
6 <servlet>
7 <servlet-name></servlet-name>
8 <servlet-class></servlet-class>
9 </servlet>
10 <servlet-mapping>
11 <servlet-name></servlet-name>
12 <url-pattern></url-pattern>
13 </servlet-mapping>
14 <welcome-file-list>
15 <welcome-file></welcome-file>
16 <welcome-file></welcome-file>
17 </welcome-file-list>
18 </web-app>
dom4j解析
DOM解析原理及结构模型
API使用
1 public class Demo01 {
2 public static void main(String[] args) throws Exception {
3 //1.获取解析器
4 SAXReader saxReader=new SAXReader();
5 //2.获得document文档对象
6 Document doc=saxReader.read("src/com/oracle/demo03/web.xml");
7 //3.获取根元素
8 Element rootElement=doc.getRootElement();
9 //获取元素名称
10 //System.out.println(rootElement.getName());
11 //获取元素中的指定属性的属性值
12 //System.out.println(rootElement.attributeValue("version"));
13 //4.获取根元素下的所有子元素
14 List<Element> childElements=rootElement.elements();
15 //5.遍历子元素
16 for(Element element:childElements){
17 //6.判断元素名称为servlet的元素
18 if("servlet".equals(element.getName())){
19 //7.获取servlet-name元素
20 Element servletName=element.element("servlet-name");
21 //8.获取servlet-class元素
22 Element servletClass=element.element("servlet-class");
23 System.out.println(servletName.getText());
24 System.out.println(servletClass.getText());
25 }
26 }
27 }
28 }
案例实现:
准备工作
1 package com.oracle.demo03;
2
3 public interface MyServlet {
4 public void init();
5 public void service();
6 public void destory();
7 }
1 public class MyServletImp implements MyServlet{
2
3 public void init() {
4 System.out.println("初始化");
5
6 }
7 public void service() {
8 System.out.println("工作");
9
10 }
11 public void destory() {
12 System.out.println("死亡");
13
14 }
15
16 }
1 public class Demo {
2 public static void main(String[] args) throws Exception {
3 //1.解析对象
4 SAXReader saxReader=new SAXReader();
5 //2.获取document对象
6 Document doc=saxReader.read("src/com/oracle/demo03/web.xml");
7 //3.获取根元素
8 Element rootElement=doc.getRootElement();
9 //4.获取根元素下的所有子元素
10 List<Element> childElements=rootElement.elements();
11 String className=null;
12 for(Element element:childElements){
13 if("servlet".equals(element.getName())){
14 className=element.element("servlet-class").getText();
15 }
16 }
17 //5.创建字节码对象
18 Class c=Class.forName(className);
19 MyServletImp myservlet=(MyServletImp)c.newInstance();
20 myservlet.init();
21 myservlet.service();
22 myservlet.destory();
23 }public class Demo {
24 public static void main(String[] args) throws Exception {
25 //1.解析对象
26 SAXReader saxReader=new SAXReader();
27 //2.获取document对象
28 Document doc=saxReader.read("src/com/oracle/demo03/web.xml");
29 //3.获取根元素
30 Element rootElement=doc.getRootElement();
31 //4.获取根元素下的所有子元素
32 List<Element> childElements=rootElement.elements();
33 String className=null;
34 for(Element element:childElements){
35 if("servlet".equals(element.getName())){
36 className=element.element("servlet-class").getText();
37 }
38 }
39 //5.创建字节码对象
40 Class c=Class.forName(className);
41 MyServletImp myservlet=(MyServletImp)c.newInstance();
42 myservlet.init();
43 myservlet.service();
44 myservlet.destory();
45 }