一、XML概述
- XML可扩展标记语言,类似HTML
- XML的设计宗旨是传输数据而非显示数据
- XML被设计具有自我描述性
- XML没有被预定义,需要自己定义标签
- XML不是HTML的替代,它们两个是为不同的目的设计的·
- XML被设计为存储和传输数据,宗旨在于传输数据
- HTML被设计用来显示数据,宗旨在于显示信息
- XML与操作系统、编程语言的开发平台无关,实现不同系统之间的数据交换
- 作用;(1)数据交互(2)配置应用程序和网站(3)Ajax基石
二、XML解析的四种方式
1、DOM解析
DOM 解析 Document Object Model 文件对象模型
DOM 接口提供了一种 通过对象模型来访问XML文件信息的方式
优点:形成了树结构 ,有助于更好的理解 掌握 且代码容易编写解析过程中 树结构保存 在内存中,方便修改。
缺点:由于文件一次性的读取,对内存的消耗比较大。如果XML文件比较大,容易影响解析的性能而会造成内存溢出
2、SAX解析
Simple APIS for XML 提供了一种访问模式 是一种顺序模式,是一种快速读写XML数据方式。
当SAX分析器对XML文档进行分析时,会触发一些列事件,并激活相应的事件函数对XML文档进行访问,SAX接口也被称为事件驱动接口。
优点:采用事件驱动模式,对内存消耗比较小,适用于只处理XML文件中的数据时
缺点:编码比较麻烦,很难同时访问XML文件中多处不同的数据。
3、JDOM解析
是一个开源项目,它基于树形结构 使用纯JAVA 实现对文档的解析 生成 序列化
4、DOM4J解析
是一种智能分支,合并了许多超出基本XML文档表示的功能,使用接口和周芳基本类方法
优点:性能优异 , 灵活性好,功能强大,极端易用,是一个开放源码的文件
三、XML的语法
- XML文档必须有根节点
- 所有XML节点都必须有一个关闭标签
- XML标签对大小写敏感,必须正确嵌套
- XML属性值必须加引号
- 在XML中,空格会被保留
- XML中的注释 <!-- 内容 -->
- XML5个预定义的实体引用
符号 | < | > | & | ' | " |
含义 | < | > | & | ‘ | “ |
四、获取Document对象
1、读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File(文件路径));
2、主动创建document对象
Document document = DocumentHelper.createDocument();
五、节点操作的方法
1、获取根节点
Element rootElement = document.getRootElement();
2、获取节点的子节点
Element accountName = element1.element("子节点名称");
3、获取节点的内容
element1.getText();
4、获取节点下的所有子节点
List<Element> program = element1.elements();
5、获取节点名称
element1.getName();
6、在节点下添加子节点
Element element = element1.addElement("子节点名称");
7、设置节点内容
element1.addText("内容");
8、删除节点
//通过调用element()获取子节点
//通过父节点.remove(子节点);删除节点
Element name = element1.element("name");
if (name.getText().equals("有报天天读(28/09/09) ")) {
element.remove(element1);
}
六、节点对象的属性方法操作
1、获取节点的属性
Attribute attribute = element1.attribute("属性名");
2、获取属性的内容
String text = attribute.getText();
3、删除属性
element1.remove(attribute);
4、设置属性的内容
attribute.setText("内容");
七、将文档写入XML文件
若文档中含有中文,设置编码格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
文档写入
XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);
writer.write(document);
writer.close();
八、示例
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class Test3 {
public static void main(String[] args) {
Test3 test3 = new Test3();
try {
File file = new File("D:\\java\\FullChannels.xml");
if (file.exists()){
SAXReader reader = new SAXReader();
Document document = reader.read(file);
Element rootElement = document.getRootElement();
List<Element> list = rootElement.elements();
for (Element element:list){
List<Element> channel = element.elements();
for (Element element1:channel) {
if (element1.getText().equals("TypeA")){
System.out.println("******北京电视台******");
test3.typeA();
}else{
System.out.println("******凤凰卫视******");
test3.typeB();
}
}
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public void typeB(){
File file = new File("D:\\java\\凤凰卫视.xml");
if (file.exists()){
SAXReader reader = new SAXReader();
try {
Document document = reader.read(file);
Element rootElement = document.getRootElement();
List<Element> list1 = rootElement.elements();
for (Element element:list1) {
System.out.println(element.getName());
List<Element> programList = element.elements();
for (Element element1:programList) {
List<Element> program = element1.elements();
for (Element element2:program) {
element2.getText();
element2.getName();
switch (element2.getName()){
case "playTime":
System.out.println(element2.getName()+"播出时间"+element2.getText());
break;
case "name":
System.out.println(element2.getName()+"节目名称"+element2.getText());
break;
case "path":
System.out.println(element2.getName()+"节目视频的本地路径"+element2.getText());
break;
}
}
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
public void typeA(){
File file = new File("D:\\java\\北京电视台.xml");
if (file.exists()){
SAXReader reader = new SAXReader();
Document document = null;
try {
document = reader.read(file);
Element rootElement = document.getRootElement();
List<Element> list = rootElement.elements();
for (Element element:list) {
if (element.getName().equals("channelName")){
System.out.println(element.getName()+"电视台名称"+element.getText());
}else{
List<Element> tvProgramTable = element.elements();
for (Element element1:tvProgramTable) {
System.out.println(element1.getName());
List<Element> tvProgram = element1.elements();
for (Element element2:tvProgram) {
switch (element2.getName()){
case "playTime":
System.out.println(element2.getName()+"节目播出时间"+element2.getText());
break;
case "meridien":
System.out.println(element2.getName()+"时段"+element2.getText());
case "programName":
System.out.println(element2.getName()+"节目名称"+element2.getText());
break;
case "path":
System.out.println(element2.getName()+"视频路径"+element2.getText());
}
}
}
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
}
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.*;
import java.util.List;
public class Test2 {
public static void main(String[] args) {
File file = new File("D:\\java\\凤凰卫视.xml");
if (file.exists()) {
SAXReader reader = new SAXReader();
Document document = null;
try {
document = reader.read(file);
Element rootElement = document.getRootElement();
Element ProgramList = rootElement.addElement("ProgramList");
Element Program = ProgramList.addElement("Program");
Program.addElement("playTime").setText("2021-7-28 17:00");
Program.addElement("name").setText("有报天天读");
Program.addElement("path").setText("***");
List<Element> list = rootElement.elements();
for (Element element : list) {
List<Element> programList = element.elements();
for (Element element1 : programList) {
Element name = element1.element("name");
Element path = element1.element("path");
if (name.getText().equals("有报天天读(28/09/09) ")) {
element.remove(element1);
}
if (name.getText().equals("音乐中国风(442) ")){
path.setText("C:\\音乐\\音乐中国风");
}
}
}
XMLWriter writer = new XMLWriter(new FileOutputStream(file));
writer.write(document);
writer.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
}