内容
* XML 1.概述 2.xml基本语法 3.xml约束和解析(重点) 在程序运行过程中,读取xml文档的数据---》解析 4.工厂模式--- 预习spring思想(拓展) 半成品软件,需要在此基础之上进行软件开发,提高效率 反射+动态代理+xml文档===框架
一 XML
1.1 概述
可扩展标记语言(EXtensible Markup Language),都是由W3C组织提供和维护
可扩展:标签可以自定义 <user></user> <student></student>
作用(功能)
* 存储数据 1.作为配置文件(框架使用它)【重点】 2.作为数据的载体,在网络中传输
XML与HTML区别
1. xml文档语法严格,html文档语言松散 2. xml文档自定义,html文档是预定义 3. xml文档存储数据,html文档展示数据
1.2 快速入门
需求:编写一个user存储信息
<?xml version="1.0" encoding="utf-8"?> <users> <user id="1"> <name>zhangsan</name> <age>18</age> </user> <user id="2"> <name>lisi</name> <age>18</age> </user> </users>
书写规范
1. 页面必须有有文档声明(必须在第一行) 2. 有且仅有一个根标签 3. 标签要正确嵌套和正确的结束 4. 标签的属性必须使用引号(单双都可)
1.3 XML组成
1. 文档声明 格式: <?xml version="版本号" encoding="字符集"?> 属性: version="1.0" 必须属性 指定xml文档的版本号 1.0(使用) or 1.1 encoding="utf-8" 可选属性,默认根据你开发环境 说明: 必须在xml文档第一行 2. 标签(元素) 双标签: <开始></结束> 单标签: <开始/> 说明: 标签命名规则与java变量是一致,建议不要使用 xml 或 XML 3. 属性 属性的定义与html属性是一致 <user 属性="属性值" 属性='属性值'></user> 特殊: id属性具有唯一性 4. 文本 实体字符(转义字符) > 大于 < 小于 & & CDATA区:将数据原样展示输出 (了解) CDATA= character + data 格式: <![CDATA[需要展示的内容]]> 5. 注释 <!-- 注释内容 -->
1.4 XML约束
1)概述
作用:规定xml文档的书写规则
学习要求
1. 能够在xml中引入约束文档 2. 能够简单的读懂约束文档 (IDE开发者工具,已经实现自动提示)
约束分类
1. DTD:一种简单的约束技术 mybatis 2. Schema:一种复杂的约束技术 spring
2)DTD约束
- 当xml文档引入了DTD约束之后,它将xml文档从可扩展标记语言变成了==预定义标记语言==,也就是说限制了xml文档出现的标签和属性的等,以及标签和属性出现的次数和顺序等
DTD约束引入方式
1. 内部DTD约束 <!DOCTYPE 根元素 [DTD约束内容]> 2. 外部DTD约束 * 本地 <!DOCTYPE 根元素 SYSTEM "DTD文件路径"> * 互联网(推荐) <!DOCTYPE 根元素 PUBLIC "DTD文件名称" "DTD文件网络路径">
DTD约束语法(了解)
1. 标签(元素) * 嵌套标签 格式:<!ELEMENT 标签名 (子标签..量词) 量词: + 一次或多次 * 零次或多次 ? 零次或一次 , 按顺序出现 | 选择其中一个 * 普通标签 格式:<!ELEMENT 标签名 标签类型> 标签类型: (#PCDATA) 字符串 EMPTY 单标签,例如:<hr/> ANY 任意类型 2. 属性 格式: <!ATTLIST 标签名 属性名 属性类型 属性说明 属性名 属性类型 属性说明 ... > 属性类型: ID 唯一,必须以字母开头 CDATA 字符串 ENUM 枚举,例如:职务(班长|学习委员|学员) '学员' 属性说明: #REQUIRED 必须项 #IMPLIED 可选项 #FIXED 固定值,例如:学校 CDATA #FIXED '程序员' <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE students SYSTEM "student.dtd"> <students> <student number="heima_001" 职务="学习委员" 学校="程序员"> <name>张三</name> <age>18</age> <sex>男</sex> </student> <student number="heima_002"> <name>李四</name> <age>20</age> <sex>男</sex> </student> </students> <!-- DTD教学实例文档.将注释中的以下内容复制到要编写的xml的声明下面 复制内容如下: <!DOCTYPE students SYSTEM "student.dtd"> --> <!-- 限定标签 ELEMENT 1)嵌套标签 格式:<!ELEMENT 标签名 (子标签 量词) > 量词: + 一次或多次 * 零次或多次 ? 零次或一次 , 按照顺序出现 | 任选其一 2)普通标签 格式:<!ELEMENT 标签名 标签类型> 标签类型: (#PCDATA) 字符串 EMPTY 空标签(单标签) <br/> ANY 表示任意标签 --> <!ELEMENT students (student*) > <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!-- 限定属性 ATTLIST attribute list 格式: <!ATTLIST 标签名 属性名 属性类型 属性说明 属性名 属性类型 属性说明 ... > 属性类型: ID:唯一,要求属性值必须以字母开头 CDATA: 字符串 ENUM 枚举: 例如: 职务(班长|学习委员|学员) '学员' 属性说明: #REQUIRED: 必选项 #IMPLIED: 可选项 # FIXED: 固定值 例如: 学校 CDATA #FIXED "程序员" --> <!ATTLIST student number CDATA #IMPLIED 职务(班长|学习委员|学员) "学员" 学校 CDATA #FIXED "程序员" >
3)Schema约束
- Schema约束是一个特殊格式的xml文档,扩展名为*.xsd,xml文档可以==引入多个schema约束==,并且还可以限制元素内容的==数据类型、数据范围 1-150==
Schema约束引入方式
<students xmlns="http://www.javaxiu.com/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.javaxiu.com/xml student.xsd" > </students> 1. xmlns = xml namespace --》xml命名空间 2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 固定值,声明当前文档是一个被Schema约束的一个实例 3. xsi:schemaLocation="http://www.javaxiu.com/xml student.xsd" 通过实例,引入约束文件路径 格式:约束名 约束路径 4. xmlns="http://www.javaxiu.com/xml" 当前xml使用缺省(默认)的Schema约束,使用此约束中的元素直接写元素名即可 例如:<student></student> 5. xmlns:aa="http://java.sun.com" 当前xml使用别名为 aa 的Schema约束,使用此约束中的元素需要加上别名 例如:<aa:student></aa:student>
二 XML解析
2.1 概述
操作xml文档,将文档中的数据读取到内存中
解析xml的方式
1. DOM:将xml文档内容一次性加载到内存,在内存中形成一颗DOM树 优点:操作方便,可以对文档进行CRUD的所有操作 缺点:占内存 2. SAX:逐行扫描文档,一边扫描一边解析 优点:不占内存 缺点:只能读取,不能增删改


常用xml解析器
技术 | 描述 |
---|---|
JAXP | SUN公司官方解析技术,支持DOM解析和SAX解析 |
PULL | Android操作系统内置的解析器,sax方式的 |
JSOUP | 是一款Java的HTML解析器(后面爬虫课程中讲解) |
JDOM | 开源的DOM方式解析技术 |
DOM4J | JDOM增强版,也是开源的DOM方式解析技术(强烈推荐) |
2.2 DOM4J解析XML
- XML DOM 和 HTML DOM一样,XML DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。
需求
通过dom4j技术来解析users.xml
如果解析的内容包含schema约束,比较麻烦
步骤分析
1. 导入jar包 dom4j-1.6.1.jar 2. 将 users.xml 复制到 src根目录下 3. 定义一个类 ParseDemo // 1.手动加载配置文件,通过类加载器 // 2.创建DOM4J解析器的核心对象 SAXReader() // 3.获取document文档对象
常用api方法
1. 提供获取xml文档根标签(元素) *Element getRootElement(); 2. Element对象提供方法 2.1 获取标签名的方法 String getName(); 2.2 获取所有的子标签信息 List<Element> elements(); 2.3 获取指定标签名的属性对象 Attribute attribute(String 属性名); 2.4 获取指定名称的子标签 Element element(String 标签名); ------------------------------------------------ 2.5 直接获取指定名称的属性值 String attributeValue(String 属性名); 2.6 直接获取指定名称子标签文本内容 String elementText(String 标签名); public static void main(String[] args) throws Exception { // 1. 手动加载配置文件 // 1.1 获取类加载器对象 ClassLoader classLoader = ParseDemo.class.getClassLoader(); // 1.2 读取users.xml 获取该文件io流 InputStream is = classLoader.getResourceAsStream("users.xml"); // 2. 创建DOM4J核心解析器对象 simple api xml SAXReader saxReader = new SAXReader(); // 2.1 加载 io流 Document document = saxReader.read(is); // 3.1 获取文档的根标签(元素) Element rootElement = document.getRootElement(); System.out.println(rootElement); // 3.2 获取根标签名 <users> String name = rootElement.getName(); System.out.println(name); // 3.3 获取users下所有的子标签榆树 List<Element> elements = rootElement.elements(); System.out.println("users子标签长度:" + elements.size()); // 3.4 获取第二个标签 Element element = elements.get(1); // 3.5 获取 第二个标签 id属性对象 Attribute idAttribute = element.attribute("id"); System.out.println(idAttribute.getValue()); // 3.6 获取name子标签 Element nameElement = element.element("name"); System.out.println(nameElement.getText()); // ----------------------- // 3.7 直接 user标签 edu属性值 System.out.println(element.attributeValue("edu")); // 3.8 直接获取 user标签 子标签的 age文本内容 System.out.println(element.elementText("age")); }
2.2 DOM4J整合Xpath解析XML
- 使用Xpath表达式可以快速查找文档中的标签
Xpath表达式
- 资料中提供了xpath学习API文档
* /aaa/bbb 绝对路径 * //bbb 任意路径 ---------------------------------- * //ccc[@id="xxx"] 根据标签id属性快速查找 document.getElementById("")
DOM4J提供了解析XPath表达式方法
1. 获取一个节点(元素) Node selectSingleNode(String xpath表达式); 2. 获取一组节点(元素) List<Node> selectNodes(String xpath表达式);
注意:还需要导入xpath依赖包 jaxen.jar
public static void main(String[] args) throws Exception { // 1. 手动加载配置文件 // 1.1 获取类加载器对象 ClassLoader classLoader = XpathDemo.class.getClassLoader(); // 1.2 读取users.xml 获取该文件io流 InputStream is = classLoader.getResourceAsStream("users.xml"); // 2. 创建DOM4J核心解析器对象 simple api xml SAXReader saxReader = new SAXReader(); // 2.1 加载 io流 Document document = saxReader.read(is); // 3.1 通过xpath表达式 获取 指定id属性值的 唯一节点 Node node = document.selectSingleNode("//f[@id='f_01']"); // 将 node节点 强转为 element元素 Element element = (Element) node; System.out.println(element.getText()); }
继续阅读

资源分享QQ群
本站是一个IT技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
评论