一、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】XML的更多相关文章

  1. 【Java】XML解析之DOM4J

    DOM4J介绍 dom4j是一个简单的开源库,用于处理XML. XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP,使用需要引用dom4j.jar包 ...

  2. 【Java】XML解析之JDOM

    JDOM介绍 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析.生成.序列化以及多种操作.使用jdom需要引入jdom.jar包. XML生成及解析 代码如下: pac ...

  3. 【Java】XML解析之SAX

    SAX介绍 SAX(Simple API for XML)是一种事件驱动的流式XML文件处理方式,区别与DOM方式的是不需要在内存中建一棵DOM树,而是根据读取XML时遇到的标签事件来顺序处理,因此具 ...

  4. 【Java】XML解析之DOM

    DOM介绍 DOM(Document Object Model)解析是官方提供的XML解析方式之一,使用时无需引入第三方包,代码编写简单,方便修改树结构,但是由于DOM解析时是将整个XML文件加载到内 ...

  5. 【Java】XML文件的解析

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  6. 【Java】模拟Sping,实现其IOC和AOP核心(二)

    接着上一篇,在上一篇完成了有关IOC的注解实现,这一篇用XML的方式实现IOC,并且完成AOP. 简易的IOC框图 注解的方式实现了左边的分支,那么就剩下右边的XML分支: XmlContext:这个 ...

  7. 【Java】NO.83.Tool.1.GlassFish.1.001-【GlassFish 5 安装使用】-

    1.0.0 Summary Tittle:[Java]NO.83.Tool.1.GlassFish.1.001-[GlassFish 5 安装使用]- Style:EBook Series:Java ...

  8. 【Java】模拟Sping,实现其IOC和AOP核心(一)

    在这里我要实现的是Spring的IOC和AOP的核心,而且有关IOC的实现,注解+XML能混合使用! 参考资料: IOC:控制反转(Inversion of Control,缩写为IoC),是面向对象 ...

  9. 【Java】一台服务器配置多个Tomcat

    需求缘由 最近接收了一个新的工具业务:ipublish发布系统,刚接手这个业务的时候,发现每次发布新的代码 需要到群里告知大家,我要停服务几分钟,准备更新代码啦.这尼玛 哪个公司都不敢这么牛逼的和用户 ...

随机推荐

  1. Linux安装Broadcom无线驱动

    参考https://blog.csdn.net/u012833250/article/details/52493806 首先查看自己的网卡型号,然后先执行sudo apt-get update 再根据 ...

  2. 「BZOJ2153」设计铁路 - 斜率DP

    A省有一条东西向的公路经常堵车,为解决这一问题,省政府对此展开了调查. 调查后得知,这条公路两侧有很多村落,每个村落里都住着很多个信仰c教的教徒,每周日都会开着自家的车沿公路到B地去"膜拜& ...

  3. HDU 4315 Climbing the Hill(阶梯博弈)

    http://acm.hdu.edu.cn/showproblem.php?pid=4315 题意:由上至下有多个格子,最顶端的是山顶,有多个球,其中有一个球是king,每次可以将球向上移动任意个格子 ...

  4. 用命令bat打开某个文件或文件夹

    打开文件或文件夹可以用start命令,start命令会根据文件关联的程序自动调用关联的程序打开文件和文件夹. 可以用记事本写如下命令,之后改扩展名为.bat即可 打开文件夹 start "& ...

  5. React组件导入的两种方式(动态导入组件的实现)

    一. react组件两种导入方式 React组件可以通过两种方式导入另一个组件 import(常用) import component from './component' require const ...

  6. 副本死亡传送(_instance_die_tele)

    玩家在副本中死亡时,将传送至对应的坐标 mapId 副本地图ID posId 坐标ID,对应_postion中posId

  7. Spring boot @Scheduled(cron = "* * * * * *") cron表达式详解

    //@Scheduled(cron = "0 0/15 * * * ?") //每15分钟触发一次 //@Scheduled(cron = "5/10 * * * * ? ...

  8. 关于git提示“warning: LF will be replaced by CRLF”终极解答

    一.发现问题 windows平台下使用git add,git deploy 文件时经常出现“warning: LF will be replaced by CRLF” 的提示. 网上很多解决办法提到: ...

  9. R 的内部机制

    在前面的章节中,我们已经学习了 R 语言的基础功能,并且了解了如何运用向量.矩阵.列表和数据框表示不同形式的数据,以及用内置函数解决简单的问题.但是仅仅了解这些功能并不能解决所有问题.现实中的数据分析 ...

  10. 《剑指offer》第五十六题(数组中唯一只出现一次的数字)

    // 面试题56(二):数组中唯一只出现一次的数字 // 题目:在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次.请 // 找出那个吃出现一次的数字. #include <iostr ...