zoukankan      html  css  js  c++  java
  • 【Java】XML

    一、XML

    XML(Extensible Markup Language),可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。

    格式:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <users>
      <user id="1">
        <username>Wayne</username>
        <password>123</password>
      </user>
      <user id="2">
        <username>Edwin</username>
        <password>234</password>
      </user>
    </users>

    二、DOM4J

    DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和易用的特点,同时它也是一个开放源代码的软件,Java中生成和解析XML文档常常使用DOM4J。

    1. 从XML读数据

    // 获取 xml 包中的 users.xml
    SAXReader reader = new SAXReader();
    Document doc = reader.read(类名.class.getClassLoader().getResource("xml/users.xml"));
    // 获取根元素
    Element root = doc.getRootElement();

    PS:

    获取类路径下的文件可以通过 “类名.class.getClassLoader().getResource(文件名);” 或 “类名.class.getClassLoader().getResourceAsStream(文件名);”实现。

    区别是 getResource 获取文件的对URL,getResourceAsStream 返回 InputStream。

    // 获取根元素的所有名为“user”的子节点
    List<Element> elements = root.elements("user");
    // attributeValue("id") - 获取属性为id的值
    /**elementText(子节点名) - 获取某个子节点中的文本值
       (不包括节点,若只有节点,则返回一组空字符串)**/
    for (Element e : elements) {
        System.out.println("[" + e.attributeValue("id") + "] " + e.elementText("username") + " - " + e.elementText("password"));
    }

    使用XPath表达式获取节点元素(一般用于指定条件查询

    /* 相对路径查找,从当前节点查找子节点book */
    List<Element> elements = root.selectNodes("book");
    /* 绝对路径查找 */
    List<Element> elements = root.selectNodes("/books/book/title");
    /* 遍历所有满足要求的节点 */
    List<Element> elements = root.selectNodes("//book");
    /* 使用 [] 填写筛选子节点的条件判断 */
    List<Element> elements = root.selectNodes("/books/book[author='Wayne']");
    /* 筛选属性时要加 @ */
    List<Element> elements = root.selectNodes("/books/book[@id >= 2]/title");
    /* 筛选条件可使用 contains 函数,and 操作符等 */
    List<Element> elements = root.selectNodes("/books/book[contains(title,'Java') and price > 80]/price");

    2. 向XML写数据

    向XML中写入对象代码:

    // 将 List<Person> 写入 XML
    private static void writePersons2XML(List<Person> persons) {
        XMLWriter out = null;
        try {
            // 写数据首先创建 Document 对象
            Document d = DocumentHelper.createDocument();
            Element root = null, e_person = null;
            if ((root = d.getRootElement()) == null) {
                root = d.addElement("persons");
            }
            for (Person p : persons) {
                e_person = root.addElement("person");
                e_person.addAttribute("age", String.valueOf(p.getAge()));
                e_person.addElement("name").addText(p.getName());
                e_person.addElement("sex").addText(p.getSex());
                e_person.addElement("idcard").addText(p.getIdcard());
            }
            String path = WriteToXML.class.getClassLoader().getResource("xml/persons.xml").getPath();
            // out.write(d)只会写入/bin/目录下的xml,而不会写入/src/下。src下改变则bin改变,但bin改变src不会改变。所以学习时通过这种暴力方法写入src的xml
            path = path.replace("bin", "src");
            out = new XMLWriter(new FileWriter(path), OutputFormat.createPrettyPrint());
            out.write(d);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null)    out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    【STM32F429】第6章 ThreadX操作系统移植(IAR)
    【STM32F429】第5章 ThreadX操作系统移植(MDK AC6)
    【硬核】超强八位半开源万用表
    【STM32H7】第4章 ThreadX操作系统移植(MDK AC5)
    【STM32F429】第4章 ThreadX操作系统移植(MDK AC5)
    【STM32H7】第3章 ThreadX操作系统介绍
    【STM32F429】第3章 ThreadX操作系统介绍
    ST发布M33内核新品STM32U5,首款40nm工艺超低功耗系列,160MHz全速运行19uA/MHz
    CAN总线35周年特别篇 -- CAN总线的前世今生
    【STM32H7】第2章 初学ThreadX准备工作
  • 原文地址:https://www.cnblogs.com/wayne793377164/p/7170769.html
Copyright © 2011-2022 走看看