xml的增删改查(dom4j.jar)
应该不用多久就可以使用通过jdk自带的jar包实现解析,–》dom解析,现在基础比较薄弱
首先通过用来xml的操作的demo4j.jar包( 配合一些其他的包 ),学会了如何使用第三方的jar包,
我在查看源码过程中,遇到反编译问题、然后给eclipse安装了反编译工具jad和JADClipse
//小伙伴如果有相同的需求,可以去我的博客里找一下反编译安装的博客,搜索配置eclipse即可
1.xml的解析
public static void main(String[] args) throws DocumentException {
// TODO Auto-generated method stub
//将xml加入到内存中形成file对象
File file = new File("e:/person.xml");
//初始化domj4的核心类
SAXReader reader = new SAXReader();
//调用read方法去读取xml文件
Document document = reader.read(file);
//展示在控制台上
// System.out.println(doucment.asXML());
//获取文档根元素
Element rootElement =document.getRootElement();
将根目录的属性转为链表
List<Attribute> attributes = rootElement.attributes();
//属性数量
System.out.println(rootElement.attributeCount());
//是否有内容
System.out.println(document.hasContent());
//将属性链表循环打印
for (Attribute attribute : attributes) {
System.out.println(attribute.getName()+" "+attribute.getValue());
}
//输出xml
System.out.println(document.asXML());
}
2.xml的写入
public static void main(String[] args) throws IOException, DocumentException {
//创建一个文档对象
Document document = DocumentHelper.createDocument();
//创建根元素
Element rootElement = document.addElement("person");
//给根元素添加属性
rootElement.addAttribute("sex", "男");
//通过根元素创建子元素
Element brainElement = rootElement.addElement("brain");
//给brain添加属性
brainElement.addAttribute("size", "36");
//给brain添加文本值
brainElement.setText("脑袋");
//.通过根元素创建子元素
Element lefteyes = brainElement.addElement("eyes");
//给lefteyes添加属性
lefteyes.addAttribute("num", "0.3");
//给lefteyes添加文本值
lefteyes.setText("左眼");
//.通过眼元素创建子元素
Element righteyes = brainElement.addElement("eyes");
//给righteyes添加属性
righteyes.addAttribute("num", "0.5");
//给lefteyes添加文本值
righteyes.setText("右眼");
//设定格式化输出标准
OutputFormat format = new OutputFormat().createPrettyPrint(); //漂亮的输出 (有回车的输出)
// OutputFormat format = new OutputFormat().createCompactFormat(); //紧凑的输出
format.setEncoding("utf-8");//设定输出的内容的编码的格式
//最后写入 写入其实是一个io操作
//s设定文件存放的路径
String path = "E://person.xml";
FileWriter fileWriter = new FileWriter(path);//开启一个写入对象,意思为与path构建一个流链接
//将文件对象存放到xml
XMLWriter xmlWriter = new XMLWriter(fileWriter,format);//第二个参数是使用相对应的 输出格式样式
//将文档输入到xml对象中
xmlWriter.write(document);
//关闭相对应的流对象
xmlWriter.close();
fileWriter.close();
System.out.println("写入成功了");
//测试
//使用demoj4核心类取读取xml文件,然后再次输出刚刚写的xml文件
File file = new File("E://person.xml");//xml对象
SAXReader r = new SAXReader();//核心类
Document d = r.read(file);
System.out.println(d.asXML());
}
3.xml删除节点元素
public static void main(String[] args) throws DocumentException, IOException {
String filepath = "e://person.xml";//获取xml对象
File file = new File(filepath);//存入文件对象
SAXReader r = new SAXReader();//实例xml核心类
Document document = r.read(file);
//然后获取根节点
Element e = document.getRootElement();
//通过根元素直接获取迭代对象
Iterator<Element> it = e.elementIterator();
//遍历二级节点,抽取属性,进行查找,然后进行删除
while (it.hasNext()) {
//获取子节点
Element evey = it.next();
System.out.println(evey.attributeValue("sid"));
//如果这个节点的sid属性不为空
if(evey.attributeValue("sid")!=null) {
//如果sid的值为102
if (evey.attributeValue("sid").equals("102"))
{
it.remove();//删除节点
}
}
}
//删除完的写入对象
OutputFormat o = OutputFormat.createPrettyPrint();
o.setEncoding("utf-8");//文件的编码格式
XMLWriter xmlWriter =new XMLWriter(new FileWriter(filepath),o);
xmlWriter.write(document);
xmlWriter.close();
}
4.xml更改节点元素
public static void main(String[] args) throws DocumentException, IOException {
String filepath = "e://person.xml";//创建路径
File file = new File(filepath);//写入文件对象
SAXReader reader = new SAXReader(); //创建demj4的核心类
Document document = reader.read(file);//读取xml对象 存储为document
Element root = document.getRootElement();//获取xml文件的根元素
List<Element> list = root.elements();//将root的子节点转为列表
//将root的子节点遍历
for (Element element : list) {
//将每个结点的属性转为迭代器
Iterator<Attribute> it = element.attributeIterator();
//遍历节点的属性
while (it.hasNext()) {
//提出每个属性
Attribute a = it.next();
//打印属性名和值
System.out.println(a.getName()+" "+a.getValue());
if(a.getValue().equals("102"))
{
element.selectSingleNode("姓名").setText("王五");
}
}
//又将二级节点下的节点查询了一遍,后续在实战中可以使用递归进行全部遍历
List<Element> list2 = element.elements();
for (Element element2 : list2) {
Iterator<Attribute> it2 = element2.attributeIterator();
while (it2.hasNext()) {
//提出每个属性
Attribute a = it2.next();
//打印属性名和值
System.out.println(a.getName()+" "+a.getValue());
if(a.getValue().equals("102"))
{
element2.selectSingleNode("姓名").setText("王五");
}
}
}
}
//将document 更改后的对象存入xml
OutputFormat o = new OutputFormat().createPrettyPrint();
o.setEncoding("utf-8");
XMLWriter xmlWriter = new XMLWriter(new FileWriter(filepath),o);
xmlWriter.write(document);
xmlWriter.close();
}
5.查询元素,属性、属性值、节点
public static void main(String[] args) throws DocumentException {
// TODO Auto-generated method stub
String path = "e://person.xml";
//文件对象
File file = new File(path);
//核心类
SAXReader saxReader = new SAXReader();
//读取xml
Document document = saxReader.read(file);
//获取根目录
Element rootElement = document.getRootElement();
//查询根目录子节点
List<Element> secondElement = rootElement.elements();
//遍历子节点
for (Element element : secondElement) {
//节点属性转列表
List<Attribute> a = element.attributes();
//获取第一个属性
Attribute attr = a.get(0);
//打印节点名字,节点属性,属性值
System.out.println(element.getName()+" ,"+attr.getName()+" : "+attr.getValue());
}
}
6.练习使用添加
/**
* @Description:xml作业
* 1.将以下信息写入一个名字为User的xml文件中
001 23岁 男 张三 1383838438
002 24岁 女 李美丽 1393939439
003 25岁 男 王五 1585858598
* @auther:Li Ya Hui
* @Time:2021年4月16日上午9:58:02
*/
public class homework {
public static void main(String[] args) throws DocumentException, IOException {
// TODO Auto-generated method stub
File file =new File("e://person.xml");
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(file);
Element root = document.getRootElement();
root.setName("User");
//遍历出根节点下所有节点
List<Element> a = root.elements();
//遍历删除
for (Element element : a) { //我首先把文件中的所有节点删除,,又练习了一边删除
//根目录的remmove方法每个节点
root.remove(element);
}
System.out.println(root.asXML());//输出xml信息
Element stu1 = root.addElement("学号");//根节点添加一个二级节点,
stu1.addAttribute("学号","001" );//属性为学号 001
stu1.addElement("年龄").setText("23岁");//001添加年龄节点
stu1.addElement("性别").setText("男"); //001添加性别节点
stu1.addElement("名字").setText("张三"); //001添加名字节点
stu1.addElement("电话").setText("1383838438");//001添加电话节点
Element stu2 = root.addElement("学号");//根节点添加一个二级节点,
stu2.addAttribute("学号","002" );//属性为学号 001
stu2.addElement("年龄").setText("24岁");//001添加年龄节点
stu2.addElement("性别").setText("女"); //001添加性别节点
stu2.addElement("名字").setText("李美丽 "); //001添加名字节点
stu2.addElement("电话").setText("1393939439");//001添加电话节点
Element stu3 = root.addElement("学号");//根节点添加一个二级节点,
stu3.addAttribute("学号","003" );//属性为学号 001
stu3.addElement("年龄").setText("25岁");//001添加年龄节点
stu3.addElement("性别").setText("男"); //001添加性别节点
stu3.addElement("名字").setText("王五"); //001添加名字节点
stu3.addElement("电话").setText("1585858598");//001添加电话节点
OutputFormat o = new OutputFormat().createPrettyPrint();//漂亮的换行输出
o.setEncoding("utf-8"); //设置编码格式
XMLWriter s = new XMLWriter(new FileWriter(file),o);//创建写入流
s.write(document); //写入文件
s.close();//关闭流
//重新加载了一遍xml新的文件
document = saxReader.read(file);
System.out.println(document.asXML());
}
}
7.练习递归查找、添加、删除、更改
/**
* @Description:作业2从person.xml文件中将所有人的姓名展示出来
* //3.张三的名字改为007
* //4.向person.xml中添加一条数据信息,004 26岁 男 李四 1343434394
* //5.将person.xml文件中的性别为女的那一条数据删除
* @auther:Li Ya Hui
* @Time:2021年4月16日上午10:49:36
*/
public class homework2 {
//递归展示 姓名
public static void main(String[] args) throws Exception {
//创建文件对象
File file = new File("e://person.xml");
//创建核心类
SAXReader saxReader = new SAXReader() ;
//读取xml文件
Document docu = saxReader.read(file);
//根节点的子节点转为链表
Element root = docu.getRootElement();
//递归查找
diGui(root);
//创建写入格式和开辟写入流
OutputFormat o = new OutputFormat().createPrettyPrint();
o.setEncoding("utf-8");
XMLWriter x = new XMLWriter(new FileWriter(file),o);
// 4小题 添加数据 004 26岁 男 李四 1343434394
Element e =root.addElement("学号").addAttribute("学号", "003");
e.addElement("年龄").setText("26岁");
e.addElement("性别").setText("男");
e.addElement("姓名").setText("李四");
e.addElement("电话").setText("1343434394");
// 写入文件
x.write(docu);
// 关闭流
x.close();
}
//递归实现查找所有姓名 //实现查找张三 //实现删除性别女的整条数据
private static void diGui(Element docu) {
@SuppressWarnings("unchecked")
List<Element> root = docu.elements();
//获取元素的长度,长度为零代表没有节点
if (root.size()==0)
{
System.out.println(docu.getName()+":此节点结束");
}else {
//遍历根目录的子节点
for (Element element : root) {
// 5 小题 删除数据 条件性别:女
if (element.selectSingleNode("性别")!=null)
{ //查找性别女
if (element.selectSingleNode("性别").getText().equals("女")) {
docu.remove(element);
}
}
//3 小题 更改名字张三
if (element.selectSingleNode("名字")!=null)
{ //查找张三
if (element.selectSingleNode("名字").getText().equals("张三")) {
element.selectSingleNode("名字").setText("007");
}
}
if(element.getName().equals("名字"))
{
System.out.println(element.getText());
}
diGui(element);
}
}
}
}