第01章:XML简介eXtensibleMarkup Language
1.01 XML简介
XML是一种可扩展的标签语言
XML即可用来做数据传递的,也可用来做数据显示,例如:android中用xml做布局
HTML是一个不可扩展的标签语言,即HTML中的标签事先由W3C组织预先定义好的,程序员不能随意添加
XML中的标签,可以由程序员按规则自行定义,不仅可以使用英文,也可以使用中文
第02章:XML在企业中应用
2.01 XML在企业中的应用主要有三点:
01——存储数据,即XML可以看作一个小型的数据库来存储数据
02——传输数据,即服务器可以将XML以IO流的方式传输到客户端
03——软件配置,即XML可以配置软件信息,如JavaEE中的web.xml
第03章:XML文档的树形结构
3.01 XML文档的树形结构
如果一个XML书写的语法是正确的,它加载到内存后,
会形成一个倒状的树结构,且只有一个根节点,依然遵循DOM规则,分为四类节点:
01——文档节点(一个)
02——元素节点
03——属性节点
04——文本节点
01_base.xml
<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id="isbn100"> <title>Java编程思想</title> <author>哈哈</author> <price>88</price> </book> </bookstore> |
倒状的树结构:
第04章:XML语法
4.01 XML语法
要学好XML,必须要对语法有所了解,XML语法分为七大部份,分别为:
01——文档声明
<?xmlversion="1.0" encoding="UTF-8"?>
位于XML文件第一行,该行前不能有空行,空格或注释
version="1.0"表示让浏览器用xml1.0版本的解析器来解析
encoding="UTF-8"表示保存时或编码时用UTF-8编码,且浏览器用UTF-8来解码
02——元素/标签/节点
XML中的元素,就是标签,标签通常由开始标签和结束标签组成,中间
是标签体,如果没有标签体的话,该标签叫空标签,用<a></a>或<a/>书写
XML中标签不能交叉乱嵌套
<a><b>乱嵌套</a></b>
空白符会被XML解析器看作是有效的字符
XML标签的命名要遵循规范,尽量做到见名知义,可以使用中英文字符
XML中标签与HTML中的标签可以同名,但含义却不同
03——属性
属性一定出现在开始标签中,可以在开始标签中书写0个或多个属性
由属性名和属性值组成,其中属性值要单引号或双引号引起来
属性名的命名要遵循规范,尽量做到见名知义,可以使用中英文字符
<桌子 宽=”100cm” 高=”30cm”/>
04——注释
XML中的注释为<!—*****-->
注释是给程序员看的,不是给XML解析器看的
注释不能嵌套
<!—乱<!--嵌-->套-->
05——CDATA【CharacterData】区段
与注释的功能相反,CDATA区中的内容是给XML解析器看的,不是给程序员看的,
XML解析器会除空白符外,原样对待
<![CDATA[
selectname,age from users where age<13
]]>
06——-转义字符
XML中的转义字符
<-------< less than
>-------> greater than
< <大话数据结构>>
07——处理指令,了解即可
指挥XML解析器如何解析XML文档内容
XML可以与CSS配置使用,从而显示出不同的效果,不过项目中,HTML才和CSS配合
而XML主要做数据储存,软件配置,传递信息
02_book.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/css" href="css/itcast.css"?> <bookstore> <book id="isbn100"> <title>Java编程思想</title> <author>哈哈</author> <price>88</price> </book> </bookstore> |
itcast.css
title{ color:red; } author{ color:green; } price{ color:blue } |
第05章:DTD简介DocumentType Definition
5.01 为什么XML文件需要约束
同一个应用需求,如果不同的程序员,可能会写多种不同的XML文件,
这就造成了将来我们用Java解析XML文件带来了负担,所以需要用一种
技术去约束XML的书写规则,这样每个程序员只能写出一种XML文件
5.02 常用的XML约束有二种
01——DTD(易用性,只有基本功能,用DTD语法书写)
02——Schema
第06章:DTD嵌入到XML中的三种方式
6.01 DTD不能单独被浏览器解析执行,必须嵌入到XML中才有效
6.02 DTD有三种方式嵌入到XML文件中,分别是:
01——内部DTD,即DTD直接书写在XML文件中
<!DOCTYPE 根节点 [DTD内容]>
03_bookstore.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE bookstore [ <!ELEMENT bookstore (book)> <!ELEMENT book (title,author,price)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)> ]> <bookstore> <book> <title>Java编程思想</title> <author>哈哈</author> <price>88</price> </book> </bookstore> |
02——外部本地DTD,即DTD与XML分开书写,
在XML文件中通过处理指令引用【本地】的DTD文件
<!DOCTYPE 根节点 SYSTEM “本地DTD的路径”>
04_bookstore.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE bookstore SYSTEM "dtd/book.dtd"> <bookstore> <book> <title>Java编程思想</title> <author>哈哈</author> <price>88</price> </book> </bookstore> |
book.dtd <!ELEMENT bookstore (book)> <!ELEMENT book (title,author,price)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)> |
03——外部远程/公共DTD,即DTD与XML分开书写,
在XML文件中通过处理指令引用【远程】的DTD文件
<!DOCTYPE 根节点 PUBLIC “DTD名字” “远程DTD的路径”>
远程DTD的路径下,就是具体DTD的约束文件,全世界所有的HTML都必须符合这个规则
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" https://www.w3.org/TR/html4/loose.dtd > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 这是HTML </body> </html> |
第07章:DTD语法
7.01 DTD语法分为三类,分别是:
01——元素【ELEMENT】
<!ELEMENT 元素 内容声明>
*:元素可以出现0次或多次
+:元素可以出现1次或多次
无:元素只能出现1次
|:元素可以二者选其一
():元素进行分组
? :元素可以出现0次或1次
, :元素必须按照一定的顺序
#PCDATA:表示元素的内容必须是文本,中文,英文,数字均可
EMPTY大写字母:表示元素中必须为空
ANY大写字母:表示元素中可以有任何内容,包含子元素,文本,空,很灵活,不建议
注意:EMPTY和ANY在定义元素时,不能书写括号
02——属性【ATTLIST】
属性必须出现在元素上
<!ATTLIST 元素名
属性名 属性类型 属性约束
属性名 属性类型 属性约束>
属性名要遵循规范,尽量做到见名知义,可以使用中英文
属性类型包括:
01——ID:表示唯一的字符串,以字母开头,如:it01
02——IDREF:表示这个唯一的值,要与另一个ID类型的属性值相同
03——(枚举值):表示取值只能是枚举中的任何一个
04——CDATA:表示属性值是字符串类型
属性约束包括:
01——#REQUIRED:表示该属性必写
02——#IMPLIED:表示该属性可写可不写
03——#FIXED"JavaEE":表示该属性可写可不写,如果写的话,一定要叫JavaEE
04——"缺省值":表示该属性可写可不写,如果不写的话,就用默认值,
如果写的话,就用实际值替代默认值
03——实体【ENTITY】
实体就是用一个变量去替代一个特殊的字符串
实体可以分为:
01——内部引用实体
在DTD中声明,在XML中使用
<!ENTITY it “我是一个程序员”>
⁢
注意:将DTD和XML合并
02——外部参数实体
在DTD中声明,在DTD中使用
<!ENTITY % tip “name,loc”>
带有%叫参数实体
不带%叫引用实体
<!ELEMENT 客户(%tip;)>
<!ELEMENT 员工 (%tip;)>
第08章:Java按照DOM规则解析XML文件
8.01 什么是解析XML文件
就是从XML文件中,提取对该应用有用的文本的过程
8.02 为什么要解析XML文件
一篇XML文件可能有很多内容,但对该应用的某个功能来讲,可能只需要其中某些片段就可以了,
不需要整个XML文件,并且XML文件中的标签只是一个辅助信息,只需要标签中的内容就行了,
这就需要对XML文件有用的地方进行解析,从而只提取有用的内容
8.03 解析XML文件为分二个类别,分别是:
01——DOM(DocumentObject Model)方式
W3C推荐的解析XML方式
一次性加载到内存,将XML文件形成一个倒状树结构
从树根开始遍历,这一点思想和javascript中DOM是相同的
JavaEE学的是DOM4J解析器,开源免费,导入dom4j-1.6.1.jar到工程的classpath路径中
Android学的是PULL解析器,开源免费,Android内置PULL解析器所需要的jar包
02——SAX(Simple Api for Xml)方式
多次性加载到内存,按事件方式依次处理
8.04 Java解析XML文件:
遍历每个节点属性值和节点之间的内容
Demo01.java
/** * 遍历每个节点属性和节点之间的内容 */ public class Demo01 { /** * 主函数 */ public static void main(String[] args) throws Exception{ SAXReader saxReader = new SAXReader(); InputStream is = Demo01.class.getClassLoader().getResourceAsStream("bookstore.xml"); Document xmlDocument = saxReader.read(is); Element rootElement = xmlDocument.getRootElement(); List<Element> bookElementList = rootElement.elements("book"); //迭代 for(Element bookElement : bookElementList){ //获取book节点的属性id的值 String id = bookElement.attributeValue("id"); //由book节点先定位到title子节点,再获取title子节点之间的内容 String title = bookElement.element("title").getText(); String auth = bookElement.element("auth").getText(); String price = bookElement.element("price").getText(); //提示 System.out.println("编号:"+id); System.out.println("标题:"+title); System.out.println("作者:"+auth); System.out.println("单位:"+price); System.out.println("======================================"); } } } |
第09章:XPath表达式(//user[@name='哈哈' and @gender=’男’ and @age>’30’])
9.01 什么是XPath
XPath是一个用于在XML文件中,快速查询符合条件标签的技术
9.02 为什么要用XPath
如果按照dom4j的传统做法,查找一个具有多层结构的标签,非常麻烦,效率太低,
如果要用XPath,能直接定位该元素,但必须导入dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar
到工程的classpath路径中
9.03 XPath常用的API
Stringxpath = "//user[@name='哈哈' and @pass='123']";书写一个XPath字符串,属性值要单引号
Elementelement = (Element) xmlDocument.selectSingleNode(xpath);返回一个集合中的第一个元素
List<Element>list = xmlDocument.selectNodes(xpath) ;返回一个集合
Node是父接口,Element是子接口
Demo02.java
/** * 使用XPath表达式来定位节点,并获取节点之间的内容 */ public class Demo02 { /** * 主函数 */ public static void main(String[] args) throws Exception{ SAXReader saxReader = new SAXReader(); InputStream is = Demo07.class.getClassLoader().getResourceAsStream("bookstore.xml"); Document xmlDocument = saxReader.read(is); //用xpath表达式定位XML文件中的title节点 String xpath = "/bookstore/book/title"; //获取符合xpath表达式匹配的所有节点的第一个 //Element titleElement = (Element) xmlDocument.selectSingleNode(xpath); //获取符合xpath表达式匹配的所有节点 List<Element> titleElementList = xmlDocument.selectNodes(xpath); for(Element titleElement : titleElementList){ String title = titleElement.getText(); System.out.println(title); } } } |
users.xml
<?xml version="1.0" encoding="UTF-8"?> <classs> <user name="哈哈" gender="男" age="22"/> <user name="呵呵" gender="男" age="23"/> <user name="嘻嘻" gender="女" age="24"/> </classs> |
Demo03.java
/** * 用户名是否在XML文件中存在 */ public class Demo08 { /** * 根据用户名和性别在XML文件中查询是否有该用户, * @param name 用户名 * @param gender 性别 * @return是否存在,true表示存在,false表示不存在 */ private static boolean exists(String name,String gender,int age) throws Exception { boolean flag = false; SAXReader saxReader = new SAXReader(); InputStream is = Demo08.class.getClassLoader().getResourceAsStream("users.xml"); Document xmlDocument = saxReader.read(is); String xpath = "//user[@name='"+name+"' and @gender='"+gender+"' and @age>'"+age+"']"; List<Element> userElementList = xmlDocument.selectNodes(xpath); if(userElementList.size()>0){ flag = true; }else{ ; } return flag; } /** * 主函数 */ public static void main(String[] args) throws Exception{ boolean flag = exists("呵呵","男",20); if(flag){ System.out.println("存在该用户名"); }else{ System.out.println("不存在该用户名"); } } } |