-
Java操作XML(5)--使用JDOM处理XML
JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。本文主要介绍使用JDOM来处理XML,文中所使用到的软件版本:Java 1.8.0_191、JDOM 2.0.6。
1、前言
W3C在设计DOM模型时,并不是针对某一种语言而设计,因此为了通用性,加入了许多繁琐而不必要的细节 ,使JAVA程序员在开发XML的应用程序过程中感到不甚方便,因此JDOM作为一种新型的XML解析器应运而生,它不遵循DOM模型,建立了自己独立的一套JDOM模型(注意JDOM决不是DOM扩展,虽然名字差不多,但两者是平行的关系),并提供功能强大使用方便的类库,使JAVA程序员可以更为高效的开发自己的XML应用程序,并极大的减少了代码量。
2、使用JDOM操作XML
2.1、XML文件
<?xml version="1.0" encoding="utf-8" ?> <school:grade xmlns:school="http://www.w3.org/TR/html4/school/"> <school:student rollno="1" school:age="10"> <school:firstname>cxx1</school:firstname> <lastname>Bob1</lastname> <nickname>stars1</nickname> <marks>85</marks> </school:student> <student rollno="2"> <firstname>cxx2</firstname> <lastname>Bob2</lastname> <nickname>stars2</nickname> <marks>85</marks> </student> <student rollno="3"> <firstname>cxx3</firstname> <lastname>Bob3</lastname> <nickname>stars3</nickname> <marks>85</marks> </student> </school:grade>
2.2、引入依赖
<dependency> <groupId>org.jdom</groupId> <artifactId>jdom2</artifactId> <version>2.0.6</version> </dependency>
2.3、Java代码例子
该例子演示了使用JDOM解析XML、JDOM中XPath的使用以及使用JDOM来生成XML。
package com.abc.demo.general.xml; import org.jdom2.*; import org.jdom2.filter.Filter; import org.jdom2.filter.Filters; import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; import org.jdom2.xpath.XPathBuilder; import org.jdom2.xpath.XPathExpression; import org.jdom2.xpath.XPathFactory; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.ByteArrayOutputStream; import java.util.List; /** * 使用JDOM处理xml */ public class JDomCase { private static Logger logger = LoggerFactory.getLogger(DomCase.class); /** * 解析xml * @throws Exception */ @Test public void parse() throws Exception { SAXBuilder sb = new SAXBuilder(); Document document = sb.build(DomCase.class.getResourceAsStream("student.xml")); Element root = document.getRootElement(); Namespace namespace = Namespace.getNamespace("school", "http://www.w3.org/TR/html4/school/"); List<Element> list = root.getChildren("student", namespace);//第1位学生 for (int i = 0; i < list.size(); i++) { Element student = list.get(i); logger.info("学生编号{}", student.getAttributeValue("rollno")); logger.info("age:{}", student.getAttributeValue("age", namespace)); logger.info("firstname:{}", student.getChildText("firstname", namespace)); logger.info("lastname:{}", student.getChildText("lastname")); logger.info("nickname:{}", student.getChildText("nickname")); logger.info("marks:{}", student.getChildText("marks")); } list = root.getChildren("student");//第2、3位学生 for (int i = 0; i < list.size(); i++) { Element student = list.get(i); logger.info("学生编号{}",student.getAttributeValue("rollno")); logger.info("firstname:{}", student.getChildText("firstname")); logger.info("lastname:{}", student.getChildText("lastname")); logger.info("nickname:{}", student.getChildText("nickname")); logger.info("marks:{}", student.getChildText("marks")); } } /** * xpath使用 * @throws Exception */ @Test public void xpath() throws Exception { SAXBuilder sb = new SAXBuilder(); Document document = sb.build(DomCase.class.getResourceAsStream("student.xml")); Namespace namespace = Namespace.getNamespace("school", "http://www.w3.org/TR/html4/school/"); Filter<Text> filter = Filters.text(); logger.info("查找所有的存在rollno属性的student节点,取出lastname的值"); XPathBuilder<Text> builder = new XPathBuilder<Text>("//student[@rollno]/lastname/text()", filter);//第2、3位学生 // XPathBuilder<Text> builder = new XPathBuilder<Text>("//student[@rollno]/child::lastname/text()", filter);//效果同上 // XPathBuilder<Text> builder = new XPathBuilder<Text>("//school:student[@rollno]/lastname/text()", filter);//第1位学生 builder.setNamespace(namespace); XPathExpression<Text> expression = builder.compileWith(XPathFactory.instance()); //XPathExpression<Object> expression = XPathFactory.instance().compile("//student[@rollno]/lastname/text()"); List<Text> list = expression.evaluate(document); for (int i = 0; i < list.size(); i++) { Text text = list.get(i); logger.info(text.getText()); } } /** * 生成xml */ @Test public void toXml() throws Exception { Document document = new Document(); Namespace namespace = Namespace.getNamespace("school", "http://www.w3.org/TR/html4/school/"); Element root = new Element("class", namespace); document.setRootElement(root); //第一个学生 Element student = new Element("student", namespace); student.setAttribute(new Attribute("rollno", "1")); student.setAttribute(new Attribute("age", "10", namespace)); Element firstname = new Element("firstname", namespace).setText("cxx1"); Element lastname = new Element("lastname").setText("Bob1"); Element nickname = new Element("nickname").setText("stars1"); Element marks = new Element("marks").setText("85"); student.addContent(firstname); student.addContent(lastname); student.addContent(nickname); student.addContent(marks); root.addContent(student); //第二个学生 student = new Element("student"); student.setAttribute(new Attribute("rollno", "2")); firstname = new Element("firstname", namespace).setText("cxx2"); lastname = new Element("lastname").setText("Bob2"); nickname = new Element("nickname").setText("stars2"); marks = new Element("marks").setText("85"); student.addContent(firstname); student.addContent(lastname); student.addContent(nickname); student.addContent(marks); root.addContent(student); //第三个学生 student = new Element("student"); student.setAttribute(new Attribute("rollno", "3")); firstname = new Element("firstname", namespace).setText("cxx3"); lastname = new Element("lastname").setText("Bob3"); nickname = new Element("nickname").setText("stars3"); marks = new Element("marks").setText("85"); student.addContent(firstname); student.addContent(lastname); student.addContent(nickname); student.addContent(marks); root.addContent(student); XMLOutputter xmlOutput = new XMLOutputter(); //xml格式化 Format format = Format.getRawFormat(); //文本缩进 format.setIndent(" "); format.setTextMode(Format.TextMode.TRIM_FULL_WHITE); xmlOutput.setFormat(format); ByteArrayOutputStream out = new ByteArrayOutputStream(); xmlOutput.output(document, out); logger.info(out.toString()); } }
来源:https://www.cnblogs.com/wuyongyin/p/14273185.html
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比