zoukankan      html  css  js  c++  java
  • javaweb学习总结十三(dom4j方式对XML文档进行解析以及Xpath的使用)

    一:dom4j方式介绍

    对于xml的解析总共有三种

    1:jaxp方式,是sun公司开发的,分为sax方式和dom方式

    2:jdom方式,后来其中部分人员参与开发dom4j

    3:dom4j方式,是现在企业使用比较多的一种方式

    二:代码案例

    1:读取xml文件中某个节点

    1):获取第二个学生的名字

     1 @Test
     2     // 1:获取第二个学生的名字
     3     public void test01() throws DocumentException {
     4         // 1:获取解析器
     5         SAXReader reader = new SAXReader();
     6         // 2:获取doc文档
     7         Document doc = reader.read(new File("xml/exam.xml"));
     8         // 3:获取根元素
     9         Element root = doc.getRootElement();
    10         // 4:获取所有的学生节点
    11         List list = root.elements("student");
    12         Element student = (Element) list.get(1);
    13         String name = student.element("name").getText();
    14         System.out.println(name);
    15     }

    2):获取第2个学生的属性名和值

     1 @Test
     2     // 2:获取第2个学生的属性名和值
     3     public void test02() throws DocumentException {
     4         // 1:获取解析器
     5         SAXReader reader = new SAXReader();
     6         // 2:获取doc文档
     7         Document doc = reader.read(new File("xml/exam.xml"));
     8         // 3:获取根元素
     9         Element root = doc.getRootElement();
    10         // 4:获取所有的学生节点
    11         List list = root.elements("student");
    12         Element student = (Element) list.get(1);
    13         // String value = student.element("name").attribute("sid").getValue();
    14         String value = student.element("name").attributeValue("sid");
    15         System.out.println("sid:" + value);
    16     }

    2:向xml文档中添加节点

     1 @Test
     2     // 3:向第一个学生添加学分节点
     3     public void test03() throws DocumentException,
     4             IOException {
     5         // 1:获取解析器
     6         SAXReader reader = new SAXReader();
     7         // 2:获取doc文档
     8         Document doc = reader.read(new File("xml/exam.xml"));
     9         // 3:获取根元素
    10         Element root = doc.getRootElement();
    11         // 4:获取所有的学生节点
    12         Element student = root.element("student");
    13         student.addElement("score").setText("100");
    14 
    15         // 5:将内存中的内容写入xml文件中
    16         XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml"));
    17         writer.write(doc);
    18         writer.flush();
    19         writer.close();
    20     }

    3:向指定位置添加节点

    这里要遍历修改添加节点的父类得到list集合,然后将节点

    添加到list集合的具体位置。

     1 @Test
     2     // 4:向指定位置添加节点(在第二个学生的年龄元素后面添加节点)
     3     public void test04() throws DocumentException, IOException {
     4         // 1:获取解析器
     5         SAXReader reader = new SAXReader();
     6         // 2:获取doc文档
     7         Document doc = reader.read(new File("xml/exam.xml"));
     8         // 3:获取根元素
     9         Element root = doc.getRootElement();
    10         // 4:获取第二个学生节点
    11         Element student = (Element) root.elements("student").get(1);
    12         List list = student.elements();
    13 
    14         // 创建分数节点
    15         Element score = DocumentHelper.createElement("score");
    16         score.setText("100");
    17         // 将节点添加到学生节点
    18         list.add(2, score);
    19 
    20         // 将内存document写入xml
    21         XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml"));
    22         writer.write(doc);
    23         writer.close();
    24     }

    4:删除节点

    得到删除节点以及父节点,然后就可以操作了,比较简单

     1 @Test
     2     // 删除上一步添加的几点
     3     public void test05() throws DocumentException, IOException,
     4             FileNotFoundException {
     5         // 1:获取解析器
     6         SAXReader reader = new SAXReader();
     7         // 2:获取doc文档
     8         Document doc = reader.read(new File("xml/exam.xml"));
     9         // 3:获取根元素
    10         Element root = doc.getRootElement();
    11         // 4:获取第二个学生节点
    12         Element student = (Element) root.elements("student").get(1);
    13         Element score = student.element("score");
    14         student.remove(score);
    15 
    16         // 将内存document写入xml
    17         XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml"));
    18         writer.write(doc);
    19         writer.close();
    20     }

    5:修改节点内容

     1 @Test
     2     // 修改第二个学生的性别
     3     public void test06() throws DocumentException, IOException {
     4         SAXReader reader = new SAXReader();
     5         Document doc = reader.read(new File("xml/exam.xml"));
     6 
     7         Element root = doc.getRootElement();
     8         Element student = (Element) root.elements("student").get(1);
     9         Element stuGender = student.element("gender");
    10         stuGender.setText("男");
    11 
    12         // 将内存document写入xml
    13         XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml"));
    14         writer.write(doc);
    15         writer.close();
    16     }

    6:修改节点属性值

     1 @Test
     2     // 修改节点的属性(修改第二个学生的sid属性为345)
     3     public void test07() throws DocumentException, IOException {
     4         SAXReader reader = new SAXReader();
     5         Document doc = reader.read(new File("xml/exam.xml"));
     6 
     7         Element root = doc.getRootElement();
     8         Element student = (Element) root.elements("student").get(1);
     9         Attribute attr  = student.attribute("sid");
    10         attr.setValue("345");
    11 
    12         // 将内存document写入xml
    13         XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml"));
    14         writer.write(doc);
    15         writer.close();
    16     }

     三:Xpath的用法

    由于dom4j的解析总是先解析根节点,然后再获取子节点.....,如果xml文件很很多层,那么解析起来会很麻烦,

    所有dom4j开发出来Xpath,有点类似正则表达式的感觉

    用例:

    谓语:

    测试案例:

    //student :获取所有的xml中所有的student元素

    [@username='username'] : 获取username为username值的student元素

     1 @Test
     2     public void testXpath() throws DocumentException {
     3         // 模拟输入用户名和密码
     4         String username = "Tom";
     5         String password = "123";
     6 
     7         SAXReader reader = new SAXReader();
     8         Document doc = reader.read("xml/exam.xml");
     9 
    10         Node node = doc.selectSingleNode("//student[@username='" + username
    11                 + "' and @password='" + password + "']");
    12         if (null != node) {
    13             System.out.println("登录成功!");
    14         } else {
    15             System.out.println("登录失败!");
    16         }
    17     }
  • 相关阅读:
    一个星期自动态的网站设计
    java特权制度设计篇
    mac默认截图、截图代码
    NSDateFormatter
    vlan 以及 Linux实现的IEEE 802.1Q VLAN
    gtk+blade+anjuta 的简单实例
    NetBSD是个开源到源码的系统
    创作gtk源码级vim帮助文档 tags
    linux 怎么使用一个c/c++库
    linux 终端控制-- 多彩输出 格式排版
  • 原文地址:https://www.cnblogs.com/warrior4236/p/5863024.html
Copyright © 2011-2022 走看看