版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40990836/article/details/79017553
一、xml 解析
xml 是用来存放数据,这些数据需要被程序传递并使用,但是xml语法有别于使用它的语言的语法(如: java)
所以需要根据 java 语法及 xml 文档规则,将 xml 储存的数据转换成想使用它语言能使用的数据,这种过程就叫做 xml 文档解析
xml 常用文档解析规则
DOM
DOM 是面向文档结构树的对象模型解析
优点: 可以清晰的展示节点的层次关系,节点之间的联代关系,具有强大的节点操作功能
缺点: 该方式会将整个文档解析的DOM树整体存放在内存中,不利于XML大型文档操作
SAX: simple api for xml
原理: SAX 是面向文档接口的逻辑(推)模型解析
优点: 具有快速处理 xml 文档的能力,解决内存(根据需求进行必要的局部解析,且前后解析具有很大的灵活性)
缺点: 无法标注节点之间的层次关系,节点功能操作
Dom4j
原理: 整合各个语法解析优点,具有灵活的DOM文档树的内存印
二、如何利用Dom4j获取xml文档
public class Dom4j01{
public static void main() throws DocumentException{
// ① 通过SAXReader() 构造器 生成操作XML的输入流
SAXReader reader = new SAXReader();
// ② 通过操作时(读取动作), 再与文件或 流 建立起直接关系
// 功能获取文件
String path = "./lesson/xml";
// 创建文件对象
File file = new File(path,"School.xml");
// 创建 document 对象
Document dom = reader.read(file);
}
}
三、Dom4j 文档解析数据操作
public class Dom4j02{
public static void main(String[] args) throws DocumentException{
// ① 获取文档document
SAXReader reader = new SAXReader();
String path = "./lesson/xml";
File file = new File(path,"School.xml");
// 创建document 对象
Document dom = reader.read(file);
// 数据相关操作
// 获取根节点 getRootElement
Element root = dom.getRootElement();
// 获取节点内容 get.TextTrim();
String rTxt = root.getTextTrim();
System.out.println(rTxt)
// 获取节点个数 attributeCount()
System.out.println(root.attibuteCount)
// 通过索引 获取对应属性
Atrribute attr = root.attribute(0);
// 通过key 获取对应属性
attr = root.attribute("value");
System.out.println(attr);
// 获取节点属性
String key = attr.getName();
String value = attr.getValue();
System.out.println(key + ":" + value);
// 节点相关操作
// 获取子节点
List<Element> list = root.Elements();
for(Element e : list){
Sysmte.out.println(e.getName());
}
// 获取指定子节点
Element stus = root.element("Student");
System.out.println(studs);
// 获取父节点
Element parent = stus.getParent();
}
}
四、修改节点
public static void fun1() throws IOException{
// 创建文档
// 利用DocumentHelper 功能类 创建 文档document
Document doc = DocumentHelper.createDocument();
// 通过dom4j通过的流 将doc 写入xml 文件
// 创建一个参数为流的XMLWriter 对象,该类会创建一个控制台输出流
XMLWriter writer = new XMLWriter();
writer.write(doc);
// 创建一个参数为流的XMLWriter 对象,则操作会依照参数流的指向
File file = new File("./lesson/xml","test.xml");
Writer out = new FileWriter(file);
writer = new XMLWriter(out);
writer.write(doc);
// 字符流关闭时, 清空缓冲区操作
writer.flush();
}
// 操作节点
public static void fun2() throws IOException{
// 文档
Document doc = DocumentHelper.creatDocument();
// xml 文件流
File file = new File("./lesson/xml","test1.xml");
// 创建XML 控制台输出流
FileOutStream out = new FileOutputStream(file);
OutputFormat format = OutputFormat.creatCompactFormat();
XMLWriter writer = new XMLWriter(out,format);
Element root = doc.addElement("Test");
root.addAttribute("msg","测试的xml");// 添加属性
Element aEle = root.addElement("A");// 添加子节点
Element bEle = root.addElement("B");// 添加子节点
aEle.addCDATA("A标签的<cdata> 文本");
bEle.addText("B标签的普通文本");
Element c1 = root.addElement("C"); // 添加子节点
c1.addElement("cc"); // 添加子节点cc
Element c2 = root.addElement("C");
c2.addText("cc") // 添加文本内容cc
Element c3 = root.addElement("C");
Document addComment = doc.addComment("注释");
writer.write(doc);
writer.close();
}
// 删除节点
public static void fun3() throws Exception{
File file = new File("./lesson/xml","test1.xml")
SAXReader reader = new SAXReader();
Document doc = reader.read(file);
// 打印到控制台
XMLWriter w1 = new XMLWriter();
// 修改属性
Element root = doc.getRootElement();
root.attribute("msg").setText("香蕉"); // 将msg 的 值 改为香蕉
w1.write(doc);
// 修改节点
// 第一个C节点下的CC节点 修改为CC节点
Element c1 = (Element)root.elements("C").get(0);
c1.remove(c1.element("cc"));
c1.addElement("CC");
// 修改节点
Element c2 = (Element) root.elements("C").get(1);
c2.setText(c2.getText() + "内容修改");
// 删除节点(没有子节点的节点) | (只删除单节点)
for(Object obj : root.elements()){
Element e = (Element) obj;
if(ele.elements().size == 0 && ele.getText().equals("")){
root.remov(ele);
}
}
w1.write(doc);
XMLWriter w2 = new XMLWriter(new FileWriter(file));
w2.writer(doc);
w2.flushc();
}