jar包神作之 dom4j (让xml解析变得如此简单)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: xml的增删改查(dom4j.jar)应该不用多久就可以使用通过jdk自带的jar包实现解析,–》dom解析,现在基础比较薄弱

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


目录
相关文章
|
30天前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
JavaScript 前端开发 算法
React 虚拟 DOM 深度解析
【10月更文挑战第5天】本文深入解析了 React 虚拟 DOM 的工作原理,包括其基础概念、优点与缺点,以及 Diff 算法的关键点。同时,分享了常见问题及解决方法,并介绍了作者在代码/项目上的成就和经验,如大型电商平台的前端重构和开源贡献。
57 3
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
80 0
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
59 1
|
3月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)