<?xml version="1.0" encoding="utf-8"?>
1、XML 声明放在 XML 文档的第一行
2、XML 声明由以下几个部分组成:
3、version - -文档符合 XML1.0 规范,我们学习 1.0
4、encoding - -文档字符编码,比如"utf-8"
每个XML文档必须有且只有一个根元素。
根元素是一个完全包括文档中其他所有元素的元素。
根元素的起始标记要放在所有其他元素的起始标记之前。
根元素的结束标记要放在所有其他元素的结束标记之后。
应用实例:
<?xml version="1.0" encoding="utf-8" ?> <!-- 老韩解读 1.每个 XML 文档必须有且只有一个根元素。 2.根元素是一个完全包括文档中其他所有元素的元素。 3.根元素的起始标记要放在所有其他元素的起始标记之前。 4.根元素的结束标记要放在所有其他元素的结束标记之后 5.XML 元素指 XML 文件中出现的标签,一个标签分为开始标签和结束标签,一 个标签有如下几种书写形式 包含标签体:<a>www.sohu.cn</a> 不含标签体的:<a></a>, 简写为:<a/> 6.一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许 交叉嵌套 7. 叫法 student 元素,节点,标签 --> <students> <student id="100"> <name>jack</name> <age>10</age> <gender>男</gender> </student> <student id="200"> <name>mary</name> <age>18</age> <gender>女</gender> </student> <school>清华大学</school> <city/> </students>
XML 元素命名规则
区分大小写,例如,
和
是两个不同的标记。
不能以数字开头。
不能包含空格。
名称中间不能包含冒号(:)。
如果标签单词需要间隔,建议使用下划线 比如 <book_title>hello</book_title>
属性值用双引号(")或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔)
一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">
特定的属性名称在同一个元素标记中只能出现一次
属性值不能包括& 字符
<Student ID="100"> <Name>TOM</Name> </Student>
注释不能嵌套;
可以在除标记以外的任何地方放注释
有些内容不想让解析引擎执行,而是当作原始内容处理(即当做普通文本),可以使用 CDATA 包括起来,CDATA 节中的所有字符都会被当作简单文本,而不是 XML 标记
语法:
这里可以把你输入的字符原样显示,不会解析 xml]]>
可以输入任意字符(除]]>外)
不能嵌套
对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理
< 表示 <
> 表示>
& 表示 &
" 表示 "
' 表示 '
不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术来解析
document 对象表示的是整个文档(可以是 html 文档,也可以是 xml 文档)
Dom4j 是一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。Dom4j 是由早期 开发 JDOM 的人分离出来而后独立开发的
Dom4j 是一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。
现在很多软件采用的 Dom4j。
使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件
读取XML文件
SAXReader reader = new SAXReader(); //创建一个解析器 Document document = reader.read(new File("src/input.xml"));//XML Document
解析 XML 形式的文本
String text = "<members></members>"; Document document = DocumentHelper.parseText(text);
主动创建 document 对象
Document document = DocumentHelper.createDocument(); //创建根节点 Element root = document.addElement("members");
应用案例
import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.jupiter.api.Test; import java.io.File; import java.io.FileOutputStream; import java.util.List; /** * @author 韩顺平 * @version 1.0 */ public class Dom4j_ { /** * 演示如何加载xml文件 */ @Test public void loadXML() throws DocumentException { //得到一个解析器 SAXReader reader = new SAXReader(); //老师的代码技巧->debug 看看document对象的属性 //分析了document对象的底层结构 Document document = reader.read(new File("src/students.xml")); System.out.println(document); } /** * 遍历所有的student信息 */ @Test public void listStus() throws DocumentException { //得到一个解析器 SAXReader reader = new SAXReader(); //老师的代码技巧->debug 看看document对象的属性 //分析了document对象的底层结构 Document document = reader.read(new File("src/students.xml")); //1. 得到rootElement, 你是OOP Element rootElement = document.getRootElement(); //2. 得到rootElement的student Elements List<Element> students = rootElement.elements("student"); //System.out.println(student.size());//2 for (Element student : students) {//element就是Student元素/节点 //获取Student元素 的name Element Element name = student.element("name"); Element age = student.element("age"); Element resume = student.element("resume"); Element gender = student.element("gender"); System.out.println("学生信息= " + name.getText() + " " + age.getText() + " " + resume.getText() + " " + gender.getText()); } } /** * 指定读取第一个学生的信息 就是 dom4j+xpath */ @Test public void readOne() throws DocumentException { //得到一个解析器 SAXReader reader = new SAXReader(); //老师的代码技巧->debug 看看document对象的属性 //分析了document对象的底层结构 Document document = reader.read(new File("src/students.xml")); //1. 得到rootElement, 你是OOP Element rootElement = document.getRootElement(); //2. 获取第一个学生 Element student = (Element) rootElement.elements("student").get(1); //3. 输出该信息 System.out.println("该学生的信息= " + student.element("name").getText() + " " + student.element("age").getText() + " " + student.element("resume").getText() + student.element("gender").getText()); //4. 获取student元素的属性 System.out.println("id= " + student.attributeValue("id")); } /** * 加元素(要求: 添加一个学生到xml中) [不要求,使用少,了解] * @throws Exception */ @Test public void add() throws Exception { //1.得到解析器 SAXReader saxReader = new SAXReader(); //2.指定解析哪个xml文件 Document document = saxReader.read(new File("src/students.xml")); //首先我们来创建一个学生节点对象 Element newStu = DocumentHelper.createElement("student"); Element newStu_name = DocumentHelper.createElement("name"); //如何给元素添加属性 newStu.addAttribute("id", "04"); newStu_name.setText("宋江"); //创建age元素 Element newStu_age = DocumentHelper.createElement("age"); newStu_age.setText("23"); //创建resume元素 Element newStu_intro = DocumentHelper.createElement("resume"); newStu_intro.setText("梁山老大"); //把三个子元素(节点)加到 newStu下 newStu.add(newStu_name); newStu.add(newStu_age); newStu.add(newStu_intro); //再把newStu节点加到根元素 document.getRootElement().add(newStu); //直接输出会出现中文乱码: OutputFormat output = OutputFormat.createPrettyPrint(); output.setEncoding("utf-8");//输出的编码utf-8 //把我们的xml文件更新 // lets write to a file //new FileOutputStream(new File("src/myClass.xml")) //使用到io编程 FileOutputStream 就是文件字节输出流 XMLWriter writer = new XMLWriter( new FileOutputStream(new File("src/students.xml")), output); writer.write(document); writer.close(); } /** * //删除元素(要求:删除第一个学生) 使用少,了解 * @throws Exception */ @Test public void del() throws Exception { //1.得到解析器 SAXReader saxReader = new SAXReader(); //2.指定解析哪个xml文件 Document document = saxReader.read(new File("src/students.xml")); //找到该元素第一个学生 Element stu = (Element) document.getRootElement().elements("student").get(2); //删除元素 stu.getParent().remove(stu); // //删除元素的某个属性 // stu.remove(stu.attribute("id")); //更新xml //直接输出会出现中文乱码: OutputFormat output = OutputFormat.createPrettyPrint(); output.setEncoding("utf-8");//输出的编码utf-8 //把我们的xml文件更新 XMLWriter writer = new XMLWriter( new FileOutputStream(new File("src/students.xml")), output); writer.write(document); writer.close(); System.out.println("删除成功~"); } /** * //更新元素(要求把所有学生的年龄+3) 使用少,了解 * @throws Exception */ @Test public void update() throws Exception { //1.得到解析器 SAXReader saxReader = new SAXReader(); //2.指定解析哪个xml文件 Document document = saxReader.read(new File("src/students.xml")); //得到所有学生的年龄 List<Element> students = document.getRootElement().elements("student"); //遍历, 所有的学生元素的age+3 for (Element student : students) { //取出年龄 Element age = student.element("age"); age.setText((Integer.parseInt(age.getText()) + 3) + ""); } //更新 //直接输出会出现中文乱码: OutputFormat output = OutputFormat.createPrettyPrint(); output.setEncoding("utf-8");//输出的编码utf-8 //把我们的xml文件更新 XMLWriter writer = new XMLWriter( new FileOutputStream(new File("src/students.xml")), output); writer.write(document); writer.close(); System.out.println("更新成功~"); } }