【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();
        }
    }
}
原文地址:https://www.cnblogs.com/wayne793377164/p/7170769.html