一、XML
XML文件的默认打开方式是浏览器
xml:是可扩展的标记语言 Extensible Markup Language。以一种标签语言与HTML类似
1、xml的作用
- 编写配置文件:C3P0编写XML配置文件
- 做数据传输
2、有效的XML文档
- 必须是格式良好的XML文档
- 使用DTD和XSD(XML Schema)定义语义约束
2.1、格式良好的XML
- 声明信息,用于描述XML的版本和编码方式
<?xml version="1.0" encoding="UTF-8"?>
- XML要有且仅有一个根元素。一个元素是一对标签,标签里面是内容
<books><!-- 根标签 -->
<books_name 属性=“属性值”><!-- 子元素 -->
<!-- 这里是写注释 -->
</books_name>
</books>
- XML是大小写敏感的
- XML是标签成对的,而且要正确嵌套
- 属性值要使用双引号。
- 注释的写法
<!-- 这里写注释 -->
【案例1】:描述一下学生的信息
<?xml version="1.0" encoding="UTF-8"?>
<Students>
<student id="1">
<name>王彤</name>
<course>Java</course>
<score>89</score>
</student>
<student id="2">
<name>李佳</name>
<course>sql</course>
<score>58</score>
</student>
</Students>
二、DTD
1、DTD简介
DTD:文档类型定义 Document Type Definition
2、DTD作用
- 约束XML文档格式,保证XML是一个有效的XML文档
3、DTD用法
DTD在使用的时候可以分为两种
- 内部DTD
- 外部DTD
3.1 内部DTD
假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:
<!DOCTYPE 根元素 [元素声明]>
【元素声明语法】
<!ELEMENT 元素名(子元素[,子元素……])>
【数量词】 限制元素出现的次数
数量词 | 含义 |
+ | 表示出现 |
? | |
* | 出现零次或多次, |
【属性声明语法】
属性声明使用下列语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
【属性类型】:CDATA,表示字符数据(character data)
【默认值】:
- #REQUIRED:必须出现
- #IMPLIED:不是必须的
<!ATTLIST student id CDATA "0">
<!ATTLIST student id CDATA #REQUIRED>
<!ATTLIST student id CDATA #IMPLIED>
【格式良好的DTD约束的XML文档】
【案例1】:描述一下学生的信息使用DTD约束
<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明内部DTD --> <!-- 中括号内写元素声明 -->
<!DOCTYPE scores [<!ELEMENT scores (student*) >
<!ELEMENT student (name, course, score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT course (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT score (#PCDATA)> <!-- 表示只允许标签里写内容 -->]>
<scores>
<student id="1">
<name>王彤</name>
<course>Java</course>
<score>89</score>
</student>
<student id="2">
<name>李佳</name>
<course>sql</course>
<score>58</score>
</student>
<student id="3">
<name>张三</name>
<course>html</course>
<score>88</score>
</student>
</scores>
3.2 外部DTD
创建一个独立的DTD文件
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT scores (student*) >
<!ELEMENT student (name, course, score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT course (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT score (#PCDATA)> <!-- 表示只允许标签里写内容 -->
在XML文件中引入DTD文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入外部DTD -->
<!DOCTYPE scores SYSTEM "Student.dtd">
<scores>
<student id="1">
<name>王彤</name>
<course>Java</course>
<score>89</score>
</student>
<student id="2">
<name>李佳</name>
<course>sql</course>
<score>58</score>
</student>
</scores>
三、约束和验证XML
1、XSD
- XSD
- XML Schema是DTD的替代者
- 不仅可以定义XML文档的结构, 还可以规范文档的内容
- XSD本身也是XML文档,
- XSD采用XML文档来定义语义约束,比DTD要复杂一-些,但是功能强大的多。
- 支持丰富的数据类型
- 允许开发者自定义数据类型
- 可读性强
- 可针对未来需求进行扩展
2、XML解析技术
对XML文件的操作,包括创建XML,对XML文件的增删改查操作
2.1常见的XML解析技术有哪些?
2.1.1 DOM解析
基于XML树结构,耗费资源。是官方提供的解析方式
2.1.2 SAX解析
是民间的解析方式,SAX是基于事件的解析方式,消耗的资源少。数据量大的时候适用
以上两种都是原生的解析方式,代码量巨大
2.1.3 JDOM解析
第三方提供的解析,开源,免费的解析方式,效率比DOM解析快
2.1.4 DOM4J接口**
第三方提供的解析,开源,免费的解析方式,是JDOM的升级版
2.2 使用DOM4J解析XML
解析XML入口是一个对象,是需要先拿到一个Document对象
2.2.1读取XML文档中的信息
- 导包:dom4j.jar
- 编写代码测试【如下】
public class Test {
public static void main(String[] args) {
//[1]创建SAX对象,用于读取XML文件
SAXReader reader = new SAXReader();
Document doc = null;
try {
// [2]读取xml文件,找到Document对象
doc = reader.read(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"xml"+File.separator+"Student2.xml"));
//[3]获取根元素 getRootElement
Element root = doc.getRootElement();
//System.out.println("根元素:"+root.getName());
//[4 iterator]迭代器迭代更元素下的所有元素
Iterator<Element> it = root.elementIterator();
while (it.hasNext()) {
Element element = (Element) it.next();
//System.out.println(element.getName());
//[5]取属性 Iterator attributes = element.attributeIterator(); 多个属性迭代继续
Attribute id = element.attribute("id");
//System.out.println(id.getName()+"="+id.getValue());
//[6]获取子元素
/*Iterator<Element> elements = element.elementIterator();
while (elements.hasNext()) {
Element element2 = (Element) elements.next();
System.out.println(element2.getName());
}*/
//[7]打印输出
System.out.println("id="+element.attribute("id").getName()+"-----"+"value="+element.attribute("id").getText());
System.out.println("name="+element.element("name").getName()+"-----"+"value="+element.element("name").getText());
System.out.println("score="+element.element("score").getName()+"-----"+"value="+element.element("score").getText());
System.out.println("course="+element.element("course").getName()+"-----"+"value="+element.element("course").getText());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.2.2 使用dom4j生成XML文件
public class Test2 {
public static void main(String[] args) {
// [1] 通过Documenthelper创建一个documnet对象
Document doc = DocumentHelper.createDocument();
// [2] 写一个Xml文件,添加一个根元素,并得到根元素
Element root = doc.addElement("books");
// [3] 为根元素添加元素
Element book = root.addElement("book");
// [4] 为元素添加属性 方便链式编程
book.addAttribute("id", "b01");
// [5] 为book添加在元素
Element name = book.addElement("name");
Element author = book.addElement("author");
Element price = book.addElement("price");
// [6] 为子元素添加文本信息
name.addText("Thinking in java");
author.addText("efcod");
price.addText("88");
// [7] 将doc输出到XML文件中即可
Writer writer = null;
Writer writerFormat = null;
try {
writer = new FileWriter(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"dom4j"+File.separator+"book2.xml"));
writerFormat = new FileWriter(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"dom4j"+File.separator+"bookFormat.xml"));
doc.write(writer);
// [8] 格式良好的输出
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer2 = new XMLWriter(writerFormat,format);
writer2.write(doc);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if (writer!=null) {
writer.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (writerFormat!=null) {
writerFormat.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}