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

简介: 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);
      }
    }
  }
}


目录
相关文章
|
2天前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML解析器是浏览器内置的工具,用于将XML转换为JavaScript可操作的XML DOM对象。这个DOM包含遍历、修改XML节点的函数。首先,XML文档需加载到DOM中,通过XMLHttpRequest对象实现,如示例所示:根据浏览器类型创建XMLHTTP对象,打开并发送GET请求到服务器获取&quot;books.xml&quot;,然后将响应转化为DOM对象。
|
3天前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML解析器是浏览器内置的工具,用于将XML转换为JavaScript可操作的XML DOM对象。通过DOM,可以进行节点的遍历、访问和修改。以下JS代码示例展示了如何加载XML文档&quot;books.xml&quot;:首先检查XMLHttpRequest支持,然后创建请求对象,打开并发送GET请求,最后将响应转化为DOM对象。
|
4天前
|
XML JavaScript 数据格式
Beautiful Soup 库的工作原理基于解析器和 DOM(文档对象模型)树的概念
【5月更文挑战第10天】Beautiful Soup 使用解析器(如 html.parser, lxml, html5lib)解析HTML/XML文档,构建DOM树。它提供方法查询和操作DOM,如find(), find_all()查找元素,get_text(), get()提取信息。还能修改DOM,添加、修改或删除元素,并通过prettify()输出格式化字符串。它是处理网页数据的利器,尤其在处理不规则结构时。
12 2
|
4天前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML解析器是浏览器内置工具,用于将XML转换为JavaScript可操作的XML DOM对象,允许遍历、修改节点。大多数现代浏览器支持这一功能。以下JS代码示例展示了如何加载XML文档&quot;books.xml&quot;
|
4天前
|
XML JavaScript Java
详解Java解析XML的四种方法
详解Java解析XML的四种方法
15 1
|
14天前
|
前端开发 JavaScript
浏览器通过构建DOM树来解析HTML代码
【4月更文挑战第30天】浏览器通过构建DOM树来解析HTML代码
25 1
|
15天前
|
前端开发 JavaScript 数据安全/隐私保护
前端javascript的DOM对象操作技巧,全场景解析(二)
前端javascript的DOM对象操作技巧,全场景解析(二)
|
15天前
|
移动开发 缓存 JavaScript
前端javascript的DOM对象操作技巧,全场景解析(一)
前端javascript的DOM对象操作技巧,全场景解析(一)
|
16天前
|
XML Web App开发 JavaScript
XML DOM 解析器
大多数浏览器内置XML解析器,用于将XML转换为JavaScript可操作的DOM对象。解析器提供遍历、修改XML节点的功能。以下JS代码示例展示了如何加载XML文档:&quot;books.xml&quot;,通过XMLHttpRequest或ActiveXObject发送请求,获取响应并转化为DOM对象。
|
18天前
|
XML 存储 数据格式
探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义
DTD(文档类型定义)用于定义XML文档的结构和合法元素、属性。它允许不同团体就数据交换标准达成一致,并用于验证XML数据的有效性。DTD可通过内部声明(在XML文档内)或外部声明(在单独文件中)来定义。内部声明示例显示了如何定义`note`元素及其子元素的结构,而外部声明则引用外部DTD文件。元素、属性、实体和PCDATA/CDATA是XML构建模块。DTD中,元素通过ELEMENT声明定义,属性通过ATTLIST声明定义,实体声明提供特殊字符或外部资源的快捷方式。
15 0

推荐镜像

更多