Java SE XML
目录
1、XML
1.xml语言是一门标记语言
2.html语法规则非常松散,xml语法规则非常严格
3.html中的标签固定的,xml语言中的标签是自定义的,根据需求定义
4.作用: 存储数据,解析数据,传递数据,配置信息…
5.学习目标: 看得懂,会填写,会编写
6.标签:
双标签 : 又开始有结束,成对出现
单标签 : 开始标签上就闭合
7.< ?xml version=“1.0” encoding=“utf-8”? > 版本控制声明,必须存在xml文件的首行存在
8.有且仅有一个根元素,跟标签
9.标签可以添加属性和子标签
属性的作用: 帮助标签展示作用功能
<!--标签及内容可以对应java中的对象信息-->
<person>
<!--商品-->
<ps id="11">
<no>102</no>
<name>苹果</name>
</ps>
<ps id="12">
<no>103</no>
<name>丝瓜</name>
</ps>
<ps id="13">
<no>104</no>
<name>西瓜</name>
</ps>
<ha>
<no>105</no>
<name><思思></name>
</ha>
</person>
1.2 基础语法
结构 :XML 文档形成了一种树结构,它从根部开始,然后扩展到枝叶。
格式良好的 XML 文档需满足以下条件
- 必须有XML声明语句 (第一行)
- 必须有且仅有一个根元素
- 标签成对
- 元素正确嵌套
- 拥有正确语法的 XML 被称为“形式良好”的 XML。
- 通过某个 DTD 进行了验证的 XML 是“合法”的 XML。
1.2.2 、标签、元素、属性
在 xml 中通过一对 <> 引起来的内容称为 标签 ,标签有开始有结束(也可以有自闭合标签),需正确配对,开始标签和结束标签之间只差一个 / 。标签区分大小写。
标签中还可以存在属性(一般在开始标签中),属性为标签添加了一些额外信息,属性的形式为 属性名=“属性 值” ,一个标签中可以存在多个属性。
从开始标签到结束标签作为一个整体,称为 元素。xml文件就是由一个一个的元素组成的。
2、解析XML
DOM4J 解析xml
- 获取流 SAXReader reader = new SAXReader();
- 指定文件,加载文件,把xml文件加载到内存 Document
- 操作标签内容
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
/*
DOM4J 解析xml
1. 获取流 SAXReader reader = new SAXReader();
2.指定文件,加载文件,把xml文件加载到内存 Document
3.操作标签内容
*/
public class XmlDemo02 {
public static void main(String[] args) throws DocumentException {
//1.获取流
SAXReader sr=new SAXReader();
//2.加载xml文件
Document dmt = sr.read("src\\week04/day05/xml/person.xml");
//3.解析数据
//跟标签
Element emt= dmt.getRootElement();
System.out.println("根节点"+emt.getName());
//子标签
List<Element> list = emt.elements();
for(Element ele:list){
System.out.println(ele.getName());
System.out.println(ele.attributeValue("id"));
List<Element> ls = ele.elements();
for(Element e:ls){
System.out.println(e.getName()+"--->"+e.getData());
}
}
}
}
2.1、获取xml文件中的内容
public static void main(String[] args) throws DocumentException, IOException {
//1获取document
Document dt=getDocument("src\\week04/day05/xml/person.xml");
}
//获取Document对象
public static Document getDocument(String path) throws DocumentException {
//1\创建一个SaxReader
SAXReader srr=new SAXReader();
//2\加载XML文件
Document doc= srr.read(path);
return doc;
}
2.2、遍历内容
public static void main(String[] args) throws DocumentException, IOException {
//1获取document
Document dt=getDocument("src\\week04/day05/xml/person.xml");
//2\遍历
print(dt);
//获取Document对象
public static Document getDocument(String path) throws DocumentException {
//1\创建一个SaxReader
SAXReader srr=new SAXReader();
//2\加载XML文件
Document doc= srr.read(path);
return doc;
}
//封装遍历方法
public static void print(Document dmt){
//1\获取归根节点
Element root=dmt.getRootElement();
System.out.println("根节点:"+root.getName());
//2、获取子节点
//List<Element> list=root.elements("good");
List<Element> list=root.elements();
for (Element emt: list) {
System.out.println("子标签:"+emt.getName());
//获取遍历子元素迭代器
Iterator<Element> ig=emt.elementIterator();
while(ig.hasNext()){
Element e= ig.next();
System.out.println("孙子标签:"+e.getName()+"-->"+e.getData());
}
}
}
2.3、写出到xml文件
public static void main(String[] args) throws DocumentException, IOException {
//3\写出
writeToXml(create());
print(getDocument("src\\week04/day05/xml/Student.xml"));
}
//创建Document
public static Document create(){
//1.创建一个Document对象
Document dmt= DocumentHelper.createDocument();
//2添加根节点
Element root= dmt.addElement("Student");
//3添加子标签
Element ele=root.addElement("student");
ele.addElement("name").addText("张三");
ele.addElement("age").addText("18");
ele.addAttribute("id","1002");
Element ele2=root.addElement("student");
ele.addElement("name").addText("李四");
ele.addElement("age").addText("20");
ele.addAttribute("id","1004");
return dmt;
}
//写出到xml文件
public static void writeToXml(Document dmt) throws IOException {
//2指定输出格式的标签格式
//OutputFormat fmt=OutputFormat.createCompactFormat();//不换行文本
OutputFormat fmt=OutputFormat.createPrettyPrint();
//构建输出流:XMLWriter
XMLWriter xw=new XMLWriter(new FileWriter("src\\week04/day05/xml/Student.xml"),fmt);
//3写出
xw.write(dmt);
//4刷出
xw.flush();
//5关闭
xw.close();
}
2.4、删除与修改 remove()
父节点.remove(子节点)
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
/*
删除与修改
父节点.remove(子节点)
*/
public class XMLDemo01 {
public static void main(String[] args) throws DocumentException, IOException {
//1.流
SAXReader reader = new SAXReader();
//2.加载xml
Document document = reader.read("src/user.xml");
//3.遍历
Element root = document.getRootElement();
List<Element> list = root.elements();
list.forEach(e->{
//如果是no为102的用户,性别修改为男
if(e.attributeValue("no").equals("102")){
e.attribute("sex").setValue("男");
}
List<Attribute> ats = e.attributes();
ats.forEach(attribute -> {
System.out.println(attribute.getName()+"--->"+attribute.getValue());
});
List<Element> list2 = e.elements();
list2.forEach(element -> {
System.out.println(element.getName()+"====>"+ element.getData());
//如果name为张三.同时子标签名为haha,就删除haha这个标签
if(e.element("name").getText().equals("张三") && element.getName().equals("haha")){
e.remove(element);
}
});
});
//写出
//1.输出格式
OutputFormat format = OutputFormat.createPrettyPrint();
//2.XMLWriter输出流
XMLWriter writer = new XMLWriter(new FileWriter("src/user.xml"),format);
//3.写出
writer.write(document);
//4.刷出
writer.flush();
//5.关闭
writer.close();
}
}
3、XML文档约束
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范(与xml语法无关),这称之为XML约束。此举主要是为了保证数据的规范性和安全性。
- DTD约束:语法简洁,功能比较单一。
- Schema约束:语法复杂,功能比较强大。
3.1、 DTD约束
DTD即文档类型定义-- Document Type Definition
一个DTD文档可能包含如下内容
- \1.元素的定义规则
- \2. 元素之间的关系规则
- \3. 属性的定义规则
DTD约束和xml写在一个文件中。
语法:
< !DOCTYPE 根元素 [元素声明] >
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Student [
<!ELEMENT Student (student) >
<!ELEMENT student (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<Student>
<student >
<name>张三</name>
<age>18</age>
</student>
<student >
<name>李四</name>
<age>20</age>
</student>
</Student>
3.2、DTD 外部导入
当验证的XML文件较多时,使用内部DTD可能出现冗余,此时可以通过引入dtd 文件进行xml 约束。
<!DOCTYPE 根元素 SYSTEM "文件名">
SYSTEM 本地文件系统
PUBLIC DTD文件为网络文件,url
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3- mapper.dtd">