课程笔记Day21
- XML
第一章 XML
第01节 基础理论
XML是什么?
XML 是一种标记型语言。 由标签组成的。(例如:html他是标记型语言,由标签组成)
HTML和XML 有什么区别呢?
(1)HTML的标签是预定义的,XML的标签是自定义的。
(2)HTML用于展示数据,XML用于存储和传输数据。
快速入门
<?xml version="1.0" encoding="utf-8" ?>
<跟标签>
<一级子标签1>
<二级子标签1 属性名称1="属性值1">
文本1
</二级子标签1>
<二级子标签2 属性名称2="属性值2">
文本2
</二级子标签2>
</一级子标签1>
<一级子标签2>
<二级子标签1>
文本1
</二级子标签1>
</一级子标签2>
</跟标签>
案例代码
<?xml version="1.0" encoding="UTF-8" ?>
<lol>
<hero id="1">
<name>
亚瑟
</name>
<age>
24
</age>
</hero>
<hero id="2">
<name>
妲己
</name>
<age>
20
</age>
</hero>
</lol>
第02节 基础语法
基本规则
1. XML文件的后缀必须都是xml
2. XML第一行必须写文档声明
3. XML中有且仅有一个根标签
4. 属性值必须使用引号,单引号、双引号都可以
5. 标签必须正确关闭,要么成对标签,要么自闭合
6. XML区分大小写
常规语法
注释怎么写?
<!-- 这是注释 -->
转义字符
在 XML 当中,有些语法会和标签规定的语法出现冲突的情况,这种情况下就需要使用转义字符。
例如: <> 如果我们就像写 尖括号的形式怎么办呢?
显示结果 | 描述 | 转义字符 |
---|---|---|
空格 | | |
< | 小于号 | < |
> | 大于号 | > |
& | 与号 | & |
" | 双引号 | " |
’ | 单引号 | ' |
× | 乘号 | × |
÷ | 除号 | &divde; |
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book id=""001"">
<name> <<西游记>> </name>
<author>作者:'吴承恩'</author>
<description>
<![CDATA[
我在这,想写什么都可以的,不一定要写标准代码。
<<嘻嘻,我是西游记>>
Sys.out.println("西游记讲的是两个和尚和三个动物的故事");
]]>
</description>
</book>
</books>
注意事项:XML当中标签是 包裹嵌套,不能写 交叉嵌套。
第03节 展示数据
用法
可以给 XML 引入css样式,用于数据的展示。
语法:
<?xml-stylesheet type="text/css" href="css文件的路径" ?>
例如
css文件
@CHARSET "utf-8";
name{
color: red;
}
xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/css" href="test.css" ?>
<books>
<book>
<name> 西游记 </name>
<author>吴承恩</author>
</book>
<book>
<name> 水浒传 </name>
<author>施耐庵</author>
</book>
<book>
<name> 红楼梦 </name>
<author>曹雪芹 高鹗</author>
</book>
<book>
<name> 三国演义 </name>
<author>罗贯中</author>
</book>
</books>
第04节 约束介绍
理论
我们知道 XML 的标签是自定义的。你想写什么,就可以写什么,只要符合标识符的规范就可以了。
但是很多情况下,我们要求 xml 的标签,不能随便写,这种情况下,就需要使用 xml的约束了。
例如: 在properties当中规定说: 用户名的键必须叫做 username 不能写别的,否则无法识别。
但是在 xml 当中,因为名字的太不规范了,所以为了规范要求,根据现实需求,就需要添加约束信息。
DTD约束
快速入门(内部引用)
<?xml version="1.0" encoding="UTF-8" ?>
<!--
DTD约束的内部引用方式
内部引用:在XML文件内部,引入DTD的语法标准
<!DOCTYPE note[ 表示说:根标签的名字是 node
<!ELEMENT node (to,form,heading,body,foot)> 表示说:在node里面,包含有 to,from,heading,body,foot 必须按照这个顺序
<!ELEMENT to (#PCDATA)> 表示说: to 他是一个简单标签,里面只能写文本。(#PCDATA) 表示文本的意思
-->
<!DOCTYPE node [
<!ELEMENT node (to,form,heading,body,foot)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT form (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ELEMENT foot (hello,world)>
<!ELEMENT hello (#PCDATA)>
<!ELEMENT world (#PCDATA)>
]>
<node>
<to></to>
<form></form>
<heading></heading>
<body></body>
<foot>
<hello>你好</hello>
<world>世界</world>
</foot>
</node>
DTD标签个数的问题
<?xml version="1.0" encoding="UTF-8" ?>
<!--
<!ELEMENT books (book*)>
表示的含义是: 在 books 里面包含 book
包含多少个呢?
如果是 + 表示1个或者N个
如果是 * 表示0个或者N个
-->
<!DOCTYPE books [
<!ELEMENT books (book*)>
<!ELEMENT book (name,author)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
]>
<books>
<book>
<name>西游记</name>
<author>吴承恩</author>
</book>
<book>
<name>水浒传</name>
<author>施耐庵</author>
</book>
</books>
外部引入的写法
dtd文件
<!DOCTYPE books [
<!ELEMENT books (book*)>
<!ELEMENT book (name,author)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
]>
xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--
引入外部 DTD的写法
-->
<!DOCTYPE books SYSTEM "hello.dtd">
<books>
<book>
<name>西游记</name>
<author>吴承恩</author>
</book>
</books>
引入网络当中的DTD约束
网络DTD <!DOCTYPE 根标签名 PUBLIC "dtd文件名" "dtd文件的位置URL" >
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
Schema约束
快速入门
world.xsd 文件
<?xml version="1.0" encoding="UTF-8" ?>
<dinghao:schema
xmlns:dinghao="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://guolong.com"
xmlns="http://guolong.com"
elementFormDefault="qualified"
>
<!-- 根标签,标签的名称是 note -->
<dinghao:element name="note">
<!-- complexType 表示当前的 note是一个复杂元素 -->
<dinghao:complexType>
<!-- sequence 顺序:表示里面的标签内容有先后顺序 -->
<dinghao:sequence>
<!-- 简单元素的写法 -->
<dinghao:element name="to" type="dinghao:string" />
<dinghao:element name="form" type="dinghao:string" />
<dinghao:element name="heading" type="dinghao:string" />
<dinghao:element name="body" type="dinghao:string" />
</dinghao:sequence>
</dinghao:complexType>
</dinghao:element>
</dinghao:schema>
xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<note
xmlns="http://guolong.com"
xmlns:xufeng="http://www.w3.org/2001/XMLSchema-instance"
xufeng:schemaLocation="http://guolong.com world.xsd"
>
<to>到哪里去</to>
<form>从哪里来</form>
<heading>头</heading>
<body>身体</body>
</note>
练习案例
xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<学生分类 xmlns="http://yanpeng.com">
<学生>
<姓名>定浩</姓名>
<年龄>18</年龄>
</学生>
<学生>
<姓名>郭龙</姓名>
<年龄>19</年龄>
</学生>
<学生>
<姓名>腚耗</姓名>
<年龄>16</年龄>
</学生>
</学生分类>
schema文件,文件名称是 student.xsd
<?xml version="1.0" encoding="UTF-8" ?>
<huangjie:schema
xmlns:huangjie="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://yanpeng.com"
xmlns="http://yanpeng.com"
elementFormDefault="qualified"
>
<!-- 根标签 -->
<huangjie:element name="学生分类">
<!-- 根标签是一个复杂类型的 -->
<huangjie:complexType>
<huangjie:sequence>
<!-- 指定子标签 学生 minOccurs 至少有1个,maxOccurs 最多多少个 -->
<huangjie:element name="学生" minOccurs="1" maxOccurs="unbounded">
<!-- 学生是一个复杂类型的 -->
<huangjie:complexType>
<huangjie:sequence>
<huangjie:element name="姓名" type="huangjie:string"/>
<huangjie:element name="年龄" type="huangjie:integer"/>
</huangjie:sequence>
</huangjie:complexType>
</huangjie:element>
</huangjie:sequence>
</huangjie:complexType>
</huangjie:element>
</huangjie:schema>
第05节 XML解析
基础理论
什么是解析
解析就是将 字符串变成对象的过程。
理解:将XML文件,整体看做一个字符串,通过特殊的手段去获取到里面的数据,封装成为对象。
理解XML的组成部分。
快速入门
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
//目标:学习Dom4j的快速入门
public class Test01 {
public static void main(String[] args) throws Exception {
//1.想办法获取到 Document的对象
String path = "JavaSEDay21\\dir\\12_理解组成部分.xml";
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(path));
//2.根标签
Element rootElement = doc.getRootElement();
//3.获取子标签
List<Element> elements = rootElement.elements();
//4.循环遍历子标签
for (Element hero : elements) {
//获取到属性的文本
String id = hero.attribute("id").getText();
//获取到元素的文本
String name = hero.element("name").getText();
String age = hero.element("age").getText();
//展示结果
System.out.println(id + "," + name + "," + age);
}
}
}
Xpath解析(基于Dom解析)
理论
专门用来解决,层次结构深的情况。能够快速找到 你要查找的内容。
快速入门
xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<中国>
<湖北省 id="hubei">
<武汉市>
<洪山区>定浩</洪山区>
<江夏区>郭龙</江夏区>
</武汉市>
<黄石市>
<黄石港>
<name>徐峰</name>
<name>陈宇波</name>
<name>黄雨浩</name>
<name>杨耿</name>
</黄石港>
<大冶区>张佑威</大冶区>
</黄石市>
</湖北省>
</中国>
工具类
//自定义的工具类,专门用于获取 Document的对象
public class DocumentUtils {
public static Document getDocument(String path) throws DocumentException {
Document doc = null;
//封装成为File的对象
File f = new File(path);
//判断,如果文件存在,则返回对象,否则不返回
if (f.exists()){
SAXReader sax = new SAXReader();
doc = sax.read(f);
}
return doc;
}
}
测试类
//目标:学习 Xpath 的快速入门
public class Test01 {
public static void main(String[] args) throws Exception{
//通过工具类,获取到 Documet的对象
String path = "JavaSEDay21\\dir\\13_省市关系.xml";
Document doc = DocumentUtils.getDocument(path);
//直接采用 Xpath解析
//List<Node> mList = doc.selectNodes("/中国/湖北省/黄石市/黄石港/name");
List<Node> mList = doc.selectNodes("/name");
for (Node nameNode : mList) {
String name = nameNode.getName();
String text = nameNode.getText();
System.out.println(name+","+text);
}
}
}
测试类,获取所有的属性 id
//目标:学习 Xpath 的快速入门
@SuppressWarnings("all")
public class Test02 {
public static void main(String[] args) throws Exception{
//通过工具类,获取到 Documet的对象
String path = "JavaSEDay21\\dir\\13_省市关系.xml";
Document doc = DocumentUtils.getDocument(path);
//直接采用 Xpath解析
//这里 //表示获取所有的信息,加上了 @则表示是属性。
List<Node> nodes = doc.selectNodes("//@id");
for (Node n : nodes) {
System.out.println(n.getText());
}
}
}
参考文档手册。 w3cshool, 找到 XML 找到 Xpath
第06节 XML生成
案例代码
//目标:将对象写入到 XML文件当中
@SuppressWarnings("all")
public class Test01 {
public static void main(String[] args) throws IOException {
//创建一个对象,将对象写入到XML文件当中
Hero hh = new Hero(1,"赵云",20);
//1.需要创建一些列的对象,添加到Document树当中
//创建Document树在内存当中。
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement("lol");
Element hero = root.addElement("hero");
hero.addAttribute("id",hh.getId()+"");
hero.addElement("name").addText(hh.getName());
hero.addElement("age").addText(hh.getAge()+"");
//2. 准备数据
String path = "JavaSEDay21\\dir\\14_英雄联盟.xml";
FileWriter fw = new FileWriter(path);
OutputFormat format = new OutputFormat();
format.setEncoding("UTF-8");
//3.直接往XML当中写入。 XMLWriter类
XMLWriter xw = new XMLWriter(fw,format);
xw.write(doc);
xw.flush();
xw.close();
}
}