XML学习笔记
一、xml简介
1.1什么是xml?
可扩展的标记性语言(Extensible Markup Language)
是一种标记语音
xml是一种非常灵活的语音,没有固定的标签,所有的标签都可以自己定义
1.2xml的作用?
通常被用于信息的记录和传递,因此xml经常被充当配置文件
1.3xml的格式
<?xml version='1.0' encoding='gbk' ?>
<users>
<user id="1">
<name>张三</name>
<age>23</age>
</user>
<user id="2">
<name>李四</name>
<age>24</age>
</user>
</users>
注意: xml文档的后缀名.xml
xml第一行必须定义为文档声明
xml文档中有且只要一个根标签
属性值必须使用引号
标签必须正确关闭
xml标签名称区分大小写
1.4与HTML的区别?
- xml是自定义的标签,html标签是固定的
- xml语法严格,html语法松散
- xml是存储数据的,html是展示数据的
二、xml语法
2.1文档声明
格式:<?xml 属性列表 ?>
属性列表:
version版本号
encoding编码方式,校验文本实际编码是否与告知编码相符合
standalone是否独立:yes不依赖于其他文件,no依赖
2.2指令(了解)
引入css样式
<?xml-stylesheet type="text/css" href="a.css"?>
user{
color: red;
}
2.3xml注释
<!--内容 -->
2.4元素(标签)
自定义标签名称规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开头
- 名称不能以字母xml(或者XML、Xml)开头
- 名称不能包含空格
2.5xml属性
- 以键值对的形式存在
- 用引号引起来
- id属性值必须唯一
2.6文本
**CDATA区:**在该区域中的数据会被原样展示
<![CDATA[
if (a<b && a>c){}
]]>
三、约束
谁编写xml?-----------用户,软件的使用者
谁解析xml?-----------软件
作为框架的使用者:
- 能够在xml引入约束文档
- 能够简单的读懂约束文档
3.1分类
DTD:一种简单的约束技术
Schema:一种复杂的约束技术
DTD:
引入dtd文档到xml文档中:
1.内部dtd:将约束规则定义在xml文档中
2.外部dtd:将约束规则定义在外部的dtd文件中
本地:
网络:
<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >
<!ELEMENT sex (#PCDATA) >
<!ATTLIST student number ID #REQUIRED>
xml
<?xml version='1.0' encoding='gbk' ?>
<!DOCTYPE students SYSTEM "Student.dtd">
<students>
<student number="s001">
<name>张三</name>
<age>18</age>
<sex>男</sex>
</student>
<student number="s002">
<name>李四</name>
<age>20</age>
<sex>男</sex>
</student>
</students>
Schema:
字符串的内容不能被DTD所约束,导致内容可以随意编写,会出现错误
四、xml解析
4.1常见的xml操作
1.解析:将xml文档中的数据读取到内存中
2.持久化:将内存中的数据 保存xml文档中 (不常用)
4.2解析xml的方式
1.DOM:
将标记语言文档一次性加载进内存中,在内存中形成一颗DOM树
优点:操作简单可以对文档进行CRUD操作
缺点:占内存,不适用移动和嵌入式设备
2.SAX:
逐行读取基于事情驱动的解析方式
3.第三方解析
jdom:在dom基础上进行了封装
dom4j:在jdom的基础上进行了封装
pull:主要用在Android手机开发,它与SAX解析方式类似,都是事件驱动方式解析xml文件
4.案例
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book bid="BID123456">
<name>Java葵花宝典</name>
<price>20.59</price>
<author>詹姆斯高斯林</author>
</book>
<book bid="BID123444">
<name>Java入门宝典</name>
<price>29.90</price>
<author>比尔盖茨</author>
</book>
</books>
book类
package dom4j;
public class Book {
private String bid;
private String name;
private String price;
private String author;
public Book() {
}
public Book(String bid, String name, String price, String author) {
this.bid = bid;
this.name = name;
this.price = price;
this.author = author;
}
public String getBid() {
return bid;
}
public void setBid(String bid) {
this.bid = bid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book{" +
"bid='" + bid + '\'' +
", name='" + name + '\'' +
", price='" + price + '\'' +
", author='" + author + '\'' +
'}';
}
}
测试
import org.dom4j.io.SAXReader;
import java.util.List;
public class test {
public static void main(String[] args) throws Exception {
//将xml文件包装成Document对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("book.xml");
//通过Document对象获取根元素
Element rootElement = document.getRootElement();
//获取根元素的子元素集合
List<Element> books = rootElement.elements("book");
//遍历,处理每一个便签,并将数据包装成book类对象
for (Element book:books) {
Element nameElement = book.element("name");
String name = nameElement.getText();
System.out.println(name);//名字
String price = book.element("price").getText();
System.out.println(price);//价格
String author = book.element("author").getText();
System.out.println(author);//作者
String bid = book.attributeValue("bid");
System.out.println(bid);
System.out.println(new Book(bid,name,price,author));
}
}
}
System.out.println(price);//价格
String author = book.element("author").getText();
System.out.println(author);//作者
String bid = book.attributeValue("bid");
System.out.println(bid);
System.out.println(new Book(bid,name,price,author));
}
}
}