java基础之XML
java基础之XML
XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。本篇文章重点介绍DOM4J对XML文件的一些操作。
1. XML解析概述
常见解析方式和解析器
- DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
缺点:XML文档过大,可能出现内存溢出显现。 - SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。
优点:处理速度快,可以处理大文件
缺点:只能读,逐行后将释放资源。
2. DOM4J介绍
2.1 常用包
| 包名 | 作用 |
|---|---|
| import org.dom4j.Document; | Document文档类 |
| import org.dom4j.Element | 元素节点类 |
| import org.dom4j.QName; | 一个对元素名字的封装类 |
| import org.dom4j.io.SAXReader; | sax读取类 |
| import org.dom4j.io.XMLWriter | xml写入类 |
| import org.dom4j.io.OutputFormat | 输出格式 |
2.2 内置元素
| 元素 | 含义 |
|---|---|
| Attribute | 定义了 XML 的属性。 |
| Branch | 指能够包含子节点的节点。如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为 |
| CDATA | 定义了 XML CDATA 区域 |
| CharacterData | 是一个标识接口,标识基于字符的节点。如CDATA,Comment, Text. |
| Comment | 定义了 XML 注释的行为 |
| Document | 定义了XML 文档 |
| DocumentType | 定义 XML DOCTYPE 声明 |
| Element | 定义XML 元素 |
| ElementHandler | 定义了Element 对象的处理器 |
| ElementPath | 被 ElementHandler 使用,用于取得当前正在处理的路径层次信息 |
| Entity | 定义 XML entity |
| Node | 为dom4j中所有的XML节点定义了多态行为 |
| NodeFilter | 定义了在dom4j 节点中产生的一个滤镜或谓词的行为(predicate) |
| ProcessingInstruction | 定义 XML 处理指令 |
| Text | 定义 XML 文本节点 |
| Visitor | 用于实现 Visitor模式 |
| XPath | 在分析一个字符串后会提供一个 XPath 表达式 |
2.2 Element类
| 方法 | 含义 |
|---|---|
| getQName() | 元素的QName对象 |
| getNamespace() | 元素所属的Namespace对象 |
| getNamespacePrefix() | 元素所属的Namespace对象的prefix |
| getNamespaceURI() | 元素所属的Namespace对象的URI |
| getName() | 元素的local name |
| getQualifiedName() | 元素的qualified name |
| getText() | 元素所含有的text内容,如果内容为空则返回一个空字符串而不是null |
| getTextTrim() | 元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null |
| attributeIterator() | 元素属性的iterator,其中每个元素都是 |
2.3 Attribute类
| 方法 | 含义 |
|---|---|
| attributeValue() | 元素的某个指定属性所含的值 |
| elementIterator() | 元素的子元素的iterator,其中每个元素都是Element对象 |
| element() | 元素的某个指定(qualified name或者local name)的子元素 |
| elementText() | 元素的某个指定(qualified name或者local name)的子元素中的text信息 |
| getParent() | 元素的父元素 |
| getPath() | 元素的XPath表达式,其中父元素的qualified name和子元素的qualified name之间使用”/”分隔 |
| isTextOnly() | 是否该元素只含有text或是空元素 |
| isRootElement() | 是否该元素是XML树的根节点 |
2.4 常用操作
- 读取xml文件,获得document对象.
SAXReader reader = new SAXReader();
Document document = reader.read(new File("***.xml"));
- 解析XML形式的文本,得到document对象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
- 获取根节点
Element root = dom.getRootElement();
- 取得某节点的单个子节点
Element memberElm=root.element("title");
- 获取节点文字
String text=memberElm.getText();
- 取得某节点下名为"title"所有字节点并进行遍历
List list = rootElm.elements("member");
Iterator<Element> it = list.iterator();
while(it.hasNext()){
Element elm = it.next();
// do something...
}
- 在某节点下添加子节点.
Element ageElm = newMemberElm.addElement("age");
- 设置节点文字.
ageElm.setText("29");
- 删除某节点.
parentElm.remove(childElm);
- 取得某节点下的某属性
Element root=document.getRootElement();
Attribute attribute=root.attribute("id");
- 设置某节点的属性和文字.
newMemberElm.addAttribute("name", "sitinspring");
- 设置属性的文字
Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");
- 删除某属性
Attribute attribute=root.attribute("size");// 属性名name
root.remove(attribute);
3. 代码演示
3.1 DOM4J读取xml文件
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<title>巴黎圣母院</title>
<author>雨果</author>
</book>
<book id="2">
<title>飘</title>
<author>米切尔</author>
</book>
</bookstore>
1. 使用List列表解析xml
import java.io.File;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XmlDemo {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
File file = new File("test.xml");
Document document = reader.read(file);
Element root = document.getRootElement();
List<Element> childElements = root.elements();
for (Element child : childElements) {
//已知属性名情况下
System.out.println("--->id: " + child.attributeValue("id"));
System.out.println("title:" + child.elementText("title"));
System.out.println("author:" + child.elementText("author"));
//未知属性名情况下
/*List<Attribute> attributeList = child.attributes();
for (Attribute attr : attributeList) {
System.out.println(attr.getName() + ": " + attr.getValue());
}
List<Element> elementList = child.elements();
for (Element ele : elementList) {
System.out.println(ele.getName() + ": " + ele.getText());
}
System.out.println();*/
}
}
}
//输出结果:
--->id: 1
title:巴黎圣母院
author:雨果
--->id: 2
title:飘
author:米切尔
2. 使用Iterator解析xml
public class XmlDemo {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("test.xml"));
Element root = document.getRootElement();
Iterator<Element> it = root.elementIterator();
while (it.hasNext()) {
Element element = it.next();
//未知属性名称情况下
Iterator<Element> attrIt = element.attributeIterator();
while (attrIt.hasNext()) {
Attribute a = (Attribute) attrIt.next();
System.out.println(a.getValue());
}
Iterator<Element> eleIt = element.elementIterator();
while (eleIt.hasNext()) {
Element e = eleIt.next();
System.out.println(e.getName() + ": " + e.getText());
}
System.out.println();
//已知元素名情况下
/*System.out.println("id: " + element.attributeValue("id"));
System.out.println("title: " + element.elementText("title"));
System.out.println("author: " + element.elementText("author"));
System.out.println();*/
}
}
}
//输出结果:
id: 1
title:巴黎圣母院
author:雨果
id: 2
title:飘
author:米切尔
3.2 DOM4J创建xml文件
public class XmlDemo {
public static void main(String[] args) throws Exception {
Document doc = DocumentHelper.createDocument();
//增加根节点
Element books = doc.addElement("bookstore");
//增加子元素
Element book1 = books.addElement("book");
Element title1 = book1.addElement("title");
Element author1 = book1.addElement("author");
Element book2 = books.addElement("book");
Element title2 = book2.addElement("title");
Element author2 = book2.addElement("author");
//为子节点添加属性
book1.addAttribute("id", "3");
//为元素添加内容
title1.setText("战争与和平");
author1.setText("列夫托尔斯泰");
book2.addAttribute("id", "4");
title2.setText("红楼梦");
author2.setText("曹雪芹");
//实例化输出格式对象
OutputFormat format = OutputFormat.createPrettyPrint();
//设置输出编码
format.setEncoding("UTF-8");
//创建需要写入的File对象
File file = new File("test2.xml");
//生成XMLWriter对象,构造函数中的参数为需要输出的文件流和格式
XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
//开始写入,write方法中包含上面创建的Document对象
writer.write(doc);
}
}
运行结果(项目根目录下):
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="3">
<title>战争与和平</title>
<author>列夫托尔斯泰</author>
</book>
<book id="4">
<title>红楼梦</title>
<author>曹雪芹</author>
</book>
</bookstore>
3.2 DOM4J修改xml文件
public class XmlDeml {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
File file = new File("test.xml");
Document document = reader.read(file);
Element root = document.getRootElement();
Element nameElement = root.element("book").element("author");
nameElement.setText("鲁迅");
//写回XML文档
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream("test.xml"), format);
writer.write(document);
writer.close();
}
}
运行结果(项目根目录下):
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<title>巴黎圣母院</title>
<author>鲁迅</author>
</book>
</bookstore>
java基础之XML的更多相关文章
- JAVA基础知识xml,date
虽然说看文档最好是看官方原来的文档,但是呢,下面是我看别的人的总结,算做抛砖引玉吧,如果有不对的,我会在后期给更正或者自己来写一篇 1,JAVA中对xml的操作,包括schema,dtd等相关知识:标 ...
- java基础篇---XML解析(二)
XML解析之最流行的方式:DOM4J dom4j是使用java语言编写的,用于读,写,操作XML的一套组件 dom4j是一个开源的java组件,可从http://sourceforge.net/pro ...
- java基础篇---XML解析(一)
XML是可扩展标记语言 在XML文件中由于更多的是描述信息的内容,所以在得到一个xml文档后应该利用程序安装其中元素的定义名称去除对应的内容,这样的操作称为XML解析. 在XML解析中W3C定义SAX ...
- java基础74 XML解析中的SAX解析相关知识点(网页知识)
1.SAX解析工具 SAX解析工具:是Sun公司提供的,内置JDK中.org.xml.sax.* 点击查看: DOM解析相关知识:以及DOM和SAX解析的原理(区别) 2.SAX解析的 ...
- java基础71 XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)
本文知识点(目录):本文下面的“实例及附录”全是DOM解析的相关内容 1.xml解析的含义 2.XML的解析方式 3.xml的解析工具 4.XML的解析原理 5.实例 6 ...
- JAVA基础之XML相关
个人理解: 知晓XML与HTML的不同,知道其的自由性和约束的方式(规范)!数据按Schema约束写到XML里,然后通过dom4j解析出所有的元素,再用反射创建对象接着调出其所有的方法!!!特别要熟练 ...
- JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)
1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...
- Spring基础篇——通过Java注解和XML配置装配bean
自动化装配的确有很大的便利性,但是却并不能适用在所有的应用场景,比如需要装配的组件类不是由自己的应用程序维护,而是引用了第三方的类库,这个时候自动装配便无法实现,Spring对此也提供了相应的解决方案 ...
- java基础之概谈xml文件解析
XML已经成为一种非常通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 诸多web应用框架,其可配置的编程方式,给我们的开发带来了非常大程度的便捷,但细细 ...
随机推荐
- 171. Excel表列序号
题目:给定一个Excel表格中的列名称,返回其相应的列序号. 例如, A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> ...
- DDD简明入门之道 - 开篇
DDD简明入门之道 - 开篇 犹豫了很久才写下此文,一怕自己对DDD的理解和实践方式有偏差,二怕误人子弟被贻笑大方,所以纰漏之处还望各位谅解.不啰嗦,马上进入正题,如果你觉得此文不错就点个赞吧. 概述 ...
- 浅谈css3长度单位rem,以及移动端布局技巧
rem是什么? rem是css3中新增加的一个单位属性(font size of the root element),根据页面的根节点的字体大小进行转变的单位.root!!!!!!!!!根节点,也就是 ...
- 一致性hash理解、拜占庭将军问题解读和CAP理论总结
一致性hash理解 白话概述: 比如说存储图片,有10台服务器用来存储,对图片名进行hash(pic_name)%10得到的值就是图片存放的服务器序号.这是正常的hash算法分散图片存储.但是有一天, ...
- Java的面向对象(初涉)
Java的面向对象(初涉) 面向对象的分析根据抽象关键的问题域来分解系统.面向对象的设计是一种提供符号设计系统的面向对象的实现过程,它用非常接近实际领域术语的方法把系统构造成"现实世界&qu ...
- 机器学习技法笔记:03 Kernel Support Vector Machine
Roadmap Kernel Trick Polynomial Kernel Gaussian Kernel Comparison of Kernels Summary
- Maven Optional & Exclusions 使用区别
Optional和Exclusions都是用来排除jar包依赖使用的,两者在使用上却是相反. Optional定义后,该依赖只能在本项目中传递,不会传递到引用该项目的父项目中,父项目需要主动引用该依赖 ...
- 深度学习笔记(八)Focal Loss
论文:Focal Loss for Dense Object Detection 论文链接:https://arxiv.org/abs/1708.02002 一. 提出背景 object detect ...
- C# 线程中使用delegate对控件进行操作
如果在线程中想改变控件的值是不可以的,会报出以下错误. 那么,如何在线程中改变控件上的值呢?第一个想到的就是委托. 委托定义:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行 ...
- python 中range函数的用法
一. range(start,end,step) 二.代码 [code1] for i in range(1,10,2): print("i=",i) [result1] i= 1 ...