package com.company;
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
public class Main {
public static void main(String[] args) throws DocumentException, IOException {
//导入jar包
//File - ProjectStructure -> 左侧Modules
//-> +号, JARS or ... ->找到jar包并添加
// demo1();
// demo2();
// demo3();
// demo4();
// demo5();
// demo6();
demo7();
}
//解析
//常用的获取内容的方法
public static void demo1() throws DocumentException {
SAXReader sax = new SAXReader();
File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
//读取文件内容,将内容以Document的形式呈现
Document document = sax.read(file);
//1. 获取根节点(students)
Element root = document.getRootElement();
//获取根节点名称 - (students)
System.out.println("根节点名称: " + root.getName());
//2. 获取节点内容 - (无)
System.out.println("根节点内容: " + root.getTextTrim());
//3. 获取子节点
List<Element> elements = root.elements();
System.out.println("子节点名称: " + elements.get(1).getName());
// 打印子节点的名字
System.out.println("子节点内容: " + elements.get(1).getTextTrim());
//"孙子节点" 获取student1的子节点
List<Element> subEs = elements.get(0).elements();
//打印student1的子节点的名字name
System.out.println("孙子节点的名称: " + subEs.get(0).getName());
//打印student的子节点的内容(本平)
System.out.println("孙子节点的内容: " + subEs.get(0).getTextTrim());
//练习: 使用for循环/for-each循环,
// 打印xml文件中所有标签的名字及内容
//提示:循环嵌套
}
public static void demo2() throws DocumentException {
//方式一 for循环
SAXReader sax = new SAXReader();
File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
//读取文件内容,将内容以Document的形式呈现
Document document = sax.read(file);
//1. 获取根节点(students)
Element root = document.getRootElement();
getNodes(root);
// List<Element> elements = root.elements();
// for (int i = 0; i < elements.size(); i++) {
// elements.get(i).getName();
// elements.get(i).getTextTrim();
// List<Element> subes = elements.get(i).elements();
// for (int j = 0; j < subes.size(); j++) {
// subes.get(j).getName();
// subes.get(j).getTextTrim();
// System.out.println("根节点名称: " + root.getName() + "子节点名称: "
// + elements.get(i).getName()
// + "孙子节点的名称: " + subes.get(j).getName() + "孙子节点的内容: " + subes.get(j).getTextTrim());
// }
// }
// //方式二 for-each循环
// System.out.println("根节点名称: " + root.getName());
// //2. 获取节点内容 - (无)
// System.out.println("根节点内容: " + root.getTextTrim());
// for (Element e : elements) {
// System.out.println("子节点名称: " + e.getName());
// //2. 获取节点内容 - (无)
// System.out.println("子节点内容: " + e.getTextTrim());
// List<Element> subEs = e.elements();
// for (Element e1 : subEs) {
// System.out.println("孙子节点名称: " + e1.getName());
// // 打印子节点的名字
// System.out.println("孙子节点内容: " + e1.getTextTrim());
// }
// }
}
//通用的遍历方式 - 递归
//参数为任意需要遍历的节点
public static void getNodes(Element node) throws DocumentException {
System.out.println("当前节点名称: " + node.getName());
System.out.println("当前节点内容: " + node.getTextTrim());
List<Attribute> attr = node.attributes();
for (Attribute a : attr) {
System.out.println("属性名称: " + a.getName());
System.out.println("属性值: " + a.getValue());
}
//获取子节点
List<Element> elements = node.elements();
//遍历所有子节点
for (Element e : elements) {
//递归, 调用自己
getNodes(e);
}
}
//属性
public static void demo3() throws DocumentException {
SAXReader sax = new SAXReader();
File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
//读取文件内容,将内容以Document的形式呈现
Document document = sax.read(file);
//1. 获取根节点(students)
Element root = document.getRootElement();
List<Element> elements = root.elements();
//获取student1节点
Element stu1 = elements.get(0);
//通过名字直接获取
//注意: 只能获取一级标签
Element e = stu1.element("name");
System.out.println(e.getName());
System.out.println(e.getTextTrim());
//通过名字直接获取值
String str = stu1.elementText("name");
System.out.println(str);
//通过名字直接获取属性
Attribute att = stu1.attribute("id");
System.out.println(att.getName());
System.out.println(att.getValue());
//通过名字直接获取属性值
String str1 = stu1.attributeValue("id");
System.out.println(str1);
//当前节点的所有属性
List<Attribute> attr = stu1.attributes();
//属性名(id)
System.out.println("属性名: " + attr.get(0).getName());
//属性值(001)
System.out.println("属性值: " + attr.get(0).getValue());
//for循环遍历
for (int i = 0; i < elements.size(); i++) {
List<Attribute> attre = elements.get(i).attributes();
for (int j = 0; j < attre.size(); j++) {
attre.get(j).getName();
attre.get(j).getValue();
System.out.println("属性名字: " + attre.get(j).getName() + "属性值: " + attre.get(j).getValue());
}
}
//for-each遍历
for (Attribute a : attr) {
System.out.println("属性名字: " + a.getName() + "属性值: " + a.getValue());
}
}
//属性的增删改查
public static void demo4() throws DocumentException {
SAXReader sax = new SAXReader();
File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
//读取文件内容,将内容以Document的形式呈现
Document document = sax.read(file);
//1. 获取根节点(students)
Element root = document.getRootElement();
//先获取有属性的节点student1
Element stu1E = root.element("student1");
//获取属性
Attribute idA = stu1E.attribute("id");
//删除属性
stu1E.remove(idA);
//添加/修改属性
//如参数1存在,即修改
//不存在,就添加
stu1E.addAttribute("id", "新id 值");
//输出改变后的student1
getNodes(stu1E);
}
//节点的增删改查
public static void demo5() throws DocumentException, IOException {
SAXReader sax = new SAXReader();
File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
//读取文件内容,将内容以Document的形式呈现
Document document = sax.read(file);
//1. 获取根节点(students)
Element root = document.getRootElement();
//先获取有属性的节点student1
Element stu1E = root.element("student1");
//添加新的节点phone
Element phoneE = stu1E.addElement("phone");
//为节点设置值
phoneE.setText("133XXXXXXXX");
stu1E.remove(phoneE);
//删除节点
Element nameE = stu1E.element("name");
// stu1E.remove(nameE);
//修改
nameE.setText("张然2");
getNodes(stu1E);
writeToFile(document);
}
//将改动写入到文件中
public static void writeToFile(Document document) throws DocumentException, IOException {
//中文字符
//输出格式
// OutputFormat format = OutputFormat.createCompactFormat();
// //设置编码
// format.setEncoding("GBK");
// File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
// FileWriter fileWriter = new FileWriter(file);
// XMLWriter xmlWriter = new XMLWriter(fileWriter, format);
// xmlWriter.write(document);
// xmlWriter.close();
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/company/student.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
}
//将字符串转化成XML
public static void demo6() throws DocumentException, IOException {
String text = "<members><member>aaa</member></members>";
Document document = DocumentHelper.parseText(text);
writeToFile(document);
}
// 将XML转化为字符串
public static void demo7() throws DocumentException, IOException {
SAXReader sax = new SAXReader();
File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
//读取文件内容,将内容以Document的形式呈现
Document document = sax.read(file);
Element root = document.getRootElement();
//将document整体转为字符串
String docStr = document.asXML();
System.out.println(docStr);
System.out.println("___________________________");
//将root根节点整体转为字符串
String rootStr = root.asXML();
System.out.println(rootStr);
System.out.println("___________________________");
//将一个节点转为字符串
String stu1 = root.element("student1").asXML();
System.out.println(stu1);
}
}
这个是我XML里面自定义的内容
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student1 id="001" color="red">
<name>张然2</name>
<sex>男</sex>
<year>23</year>
<phone>133XXXXXXXX</phone>
</student1>
<student2 id="002">
<name>云赫</name>
<year>24</year>
<sex>女</sex>
</student2>
</students>