第十章:XML
一,XML简介
XML : XML(EXtensible Markup Language)可扩展标记语言
xml的主要作用有:
1、用来保存数据,而且这些数据具有自我描述性
2、它还可以作为项目或者模块的配置文件(javaweb的web.xml)
3、还可以用来做网络传输数据的格式(现在用不多了,都是JSON为主)
特点:
XML与操作系统、编程语言的开发平台无关
实现不同系统之间的数据交换
作用:
- 数据交互
- 配置应用程序和网站
- Ajax基石
XML文档结构
注意: XML声明是可选的,因此你的xml没有它就可以很好地形成。但建议使用它,以便解析器不会做出错误的假设,特别是关于所使用的编码。
XML标签
XML文档内容由一系列标签元素组成。
语法:
<元素名 属性名=“属性值”>元素内容</元素名>
示例:
NoKris 或者
注意:
- 属性值用双引号包裹
- 一个元素可以有多个属性
- 属性值中不能直接包含<、“、&
- 不建议使用的字符:‘、>
要使用特殊字符时可以用转义字符:&(&),<(<),>(>) 等;
XML属性
xml属性和html一样,都要有属性名=“属性值”,并且都要在标签内部。这就不再过多的讲解。
XML编写注意事项
- XML 文档必须有切仅有一个根元素。
- 所有XML元素都必须有结束标签
- XML标签对大小写敏感
- XML必须正确的嵌套
- 同级标签以缩进对齐
- 元素名称可以包含字母、数字或其他的字符
- 元素名称不能以数字或者标点符号开始
- 元素名称中不能含空格
!!!错误示例:<title><name>XML编程</title></name>
!!!错误原因:XML标签嵌套错误。
二,XML解析器
上面我们提到了,xml是可以跨平台,无视操作系统交换数据的,那么我们java在拿到其他平台的xml文件,该如何解析呢?
解析器类型:
非验证解析器
检查文档格式是否良好
验证解析器
使用DTD检查文档的有效性
DTD(Document Type Definition),文档类型定义,用来约束XML文档。例如要求xml文档的根元素必须是什么,在元素下可以包含多少个元素,每个元素必须有一个什么属性,而且还可以定义有多少个子元素,分别为...,子元素的内容必须为文本内容等
解析XML技术
- DOM
基于XML文档树结构的解析
适用于多次访问的XML文档
特点:比较消耗资源- SAX
基于事件的解析
适用于大数据量的XML文档
特点:占用资源少,内存消耗小- DOM4J
非常优秀的Java XML API
性能优异、功能强大
开放源代码
我们今天重点讲的是DOM4j。
三,DOM4j
我们用DOM4j解析XML代码不过是对XML的CRUD(增删改查),想用DOM4j,我们需要导入dom4j的jar包,jar包可以自己搜着下载,我们只用maven导入,简单快捷。
maven:
<dependencies> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.1</version> </dependency> </dependencies>
增:
直接上代码,再分析怎么使用。
public static void main(String[] args) throws IOException {
Document document = DocumentHelper.createDocument();
Element e1 = document.addElement("aaa");
Element a = e1.addAttribute("a", "123");
a.setText("1234112");
OutputFormat outputFormat= OutputFormat.createPrettyPrint();
outputFormat.setEncoding("UTF-8");
XMLWriter xmlWriter = new XMLWriter(new FileWriter("aaa.xml"),outputFormat);
xmlWriter.write(document);
xmlWriter.close();
}
第一步:
- 使用
DocumentHelper.createDocument()
方法创建一个Document对象这个document不是文件,而是一个Document类的java对象,理解成他可以存储XML结构的文本就可以。
第二步:
- 使用
addElement()
方法添加元素,要注意只有一个根元素。方法的返回值是添加的这个Element元素对象。
第三步:
- 使用
Element对象名.addAttribute(name,value)
方法添加该对象的属性和属性值,返回的是该对象,这个方法一般不用返回值。
第四步:
- 使用
Element对象名.setText(String)
设置标签的内容,也就是两个标签之间的文本。(<aaa a="123">1234112</aaa>
中的1234112就是setText操作区域)
第五步:
- 套公式写入文件中:
OutputFormat outputFormat= OutputFormat.createPrettyPrint();//通过OutputFormat静态方法得到输出格式对象
outputFormat.setEncoding("UTF-8");//设置文件编号为UTF-8
XMLWriter xmlWriter = new XMLWriter(new FileWriter("aaa.xml"),outputFormat);//得到XML字符流并设置格式
xmlWriter.write(document);//把document写入文件。
xmlWriter.close();//关闭流,释放资源
上面的是固定套用,记住即可,也可以自己封装成工具类使用。
删:
先说一下流程,删的过程和增加差不多,只是我们不用新创建一个document,而是从XML文件中读取出来一个document,然后进行完删除操作后,还是套用上面的写文件公式,写入文件,等于我们修改读取出来的document,修改后再写入覆盖掉原本的文件内容。
第一步:
- 读取XML文件的到Document对象
SAXReader saxReader = new SAXReader();//创建SAX读取器
Document document = saxReader.read("./src/main/resources/Books.xml");//读取该路径下的XML文件,返回一个Document对象,这里要抛异常。
第二步:
- 进行修改: 和增加一样,我们要得到想要删除的节点。
Element rootElement = document.getRootElement();//获得根元素
List<Element> bookse = rootElement.elements();//获得根元素的子元素
for (Element e : bookse) {
if(e.getName().equals("想要找的标签名")){
e.getParent().remove(e);
}
System.out.print(e.getName()+" ");
}
获得根元素的方法就是getRootElement()
返回根元素。
当我们通过以上方式找到想要删除的节点时,我们进行第三步。
第三步:
- 删除操作:
e.getParent().remove(e);//通过getParent()方法得到父元素,然后调用remove()方法删除子元素。
注意:我们找到的元素e没办法自己删除自己,所以要通过父元素删除元素e。
第四步:
- 写入XML文件,和增加一样,套用公式即可。
OutputFormat outputFormat= OutputFormat.createPrettyPrint();//通过OutputFormat静态方法得到输出格式对象
outputFormat.setEncoding("UTF-8");//设置文件编号为UTF-8
XMLWriter xmlWriter = new XMLWriter(new FileWriter("aaa.xml"),outputFormat);//得到XML字符流并设置格式
xmlWriter.write(document);//把document写入文件。
xmlWriter.close();//关闭流,释放资源
改:
改和删几乎一致。
第一步:
- 读取XML文件的到Document对象
SAXReader saxReader = new SAXReader();//创建SAX读取器
Document document = saxReader.read("./src/main/resources/Books.xml");//读取该路径下的XML文件,返回一个Document对象,这里要抛异常。
第二步:
- 进行修改: 可以进行添加或者删除操作
Element rootElement = document.getRootElement();//获得根元素
List<Element> bookse = rootElement.elements();//获得根元素的子元素
for (Element e : bookse) {
if(e.getName().equals("想要找的标签名")){
e.addElement("要添加的标签名");
// e.getParent().remove(e);
}
System.out.print(e.getName()+" ");
}
修改相关方法:
- addAttribute() : 添加属性
- setText() :设置文本内容
- addElement() : 添加元素(标签)
- remove() ; 删除元素
第三步:
- 写入XML文件,和增加一样,套用公式即可。
OutputFormat outputFormat= OutputFormat.createPrettyPrint();//通过OutputFormat静态方法得到输出格式对象
outputFormat.setEncoding("UTF-8");//设置文件编号为UTF-8
XMLWriter xmlWriter = new XMLWriter(new FileWriter("aaa.xml"),outputFormat);//得到XML字符流并设置格式
xmlWriter.write(document);//把document写入文件。
xmlWriter.close();//关闭流,释放资源
查:
查询的想必就不用赘述了,我们在进行增删改的时候都是在遍历XML文档,我们只需要把想要的信息用if判断筛选出来,再用 System.out.print();
输出就可以了。