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); } } } }