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();
            }
        }
    }
  • 相关阅读:
    java继承
    c#中委托和事件区别
    c#委托中的匿名方法和lambda表达式
    c#中内置委托
    iOS消息推送获取不到deviceToken解决方案
    python+appium+iOS自动化测试case如何写?
    Xcode查看iOS崩溃与崩溃日志分析
    iOS性能检测工具instrunments简单介绍
    python实现使用代码进行代理配置
    python+locust性能测试-最简单的登录点击次数
  • 原文地址:https://www.cnblogs.com/wayne793377164/p/7170769.html
Copyright © 2011-2022 走看看