java基础之XML

XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。本篇文章重点介绍DOM4J对XML文件的一些操作。

1. XML解析概述

  常见解析方式和解析器

  1. DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。

    优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

    缺点:XML文档过大,可能出现内存溢出显现。
  2. 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的更多相关文章

  1. JAVA基础知识xml,date

    虽然说看文档最好是看官方原来的文档,但是呢,下面是我看别的人的总结,算做抛砖引玉吧,如果有不对的,我会在后期给更正或者自己来写一篇 1,JAVA中对xml的操作,包括schema,dtd等相关知识:标 ...

  2. java基础篇---XML解析(二)

    XML解析之最流行的方式:DOM4J dom4j是使用java语言编写的,用于读,写,操作XML的一套组件 dom4j是一个开源的java组件,可从http://sourceforge.net/pro ...

  3. java基础篇---XML解析(一)

    XML是可扩展标记语言 在XML文件中由于更多的是描述信息的内容,所以在得到一个xml文档后应该利用程序安装其中元素的定义名称去除对应的内容,这样的操作称为XML解析. 在XML解析中W3C定义SAX ...

  4. java基础74 XML解析中的SAX解析相关知识点(网页知识)

    1.SAX解析工具 SAX解析工具:是Sun公司提供的,内置JDK中.org.xml.sax.*         点击查看: DOM解析相关知识:以及DOM和SAX解析的原理(区别) 2.SAX解析的 ...

  5. java基础71 XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)

    本文知识点(目录):本文下面的“实例及附录”全是DOM解析的相关内容 1.xml解析的含义    2.XML的解析方式    3.xml的解析工具    4.XML的解析原理    5.实例    6 ...

  6. JAVA基础之XML相关

    个人理解: 知晓XML与HTML的不同,知道其的自由性和约束的方式(规范)!数据按Schema约束写到XML里,然后通过dom4j解析出所有的元素,再用反射创建对象接着调出其所有的方法!!!特别要熟练 ...

  7. JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)

    1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...

  8. Spring基础篇——通过Java注解和XML配置装配bean

    自动化装配的确有很大的便利性,但是却并不能适用在所有的应用场景,比如需要装配的组件类不是由自己的应用程序维护,而是引用了第三方的类库,这个时候自动装配便无法实现,Spring对此也提供了相应的解决方案 ...

  9. java基础之概谈xml文件解析

    XML已经成为一种非常通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 诸多web应用框架,其可配置的编程方式,给我们的开发带来了非常大程度的便捷,但细细 ...

随机推荐

  1. HTML学习总结(作业五)

    1:HTML简介 超文本标记语言,标准通用标记语言下的一个应用.是 网页制作必备的编程语言“超文本”就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素.超文本标记语言的结构包括“头”部分(英语 ...

  2. 【python接口自动化测试教程】00---00章节就代表开篇吧

    今天突然想写个接口测试教程,由于本人是初级的比小白稍微好那么一丢丢,所以不知道能不能坚持下来 写的不对的地方还请大咖指教 先去忙自己的工作了,忙完了回来开始写第一章吧 或者先写个大纲,要不然写的章节会 ...

  3. PHP 文件处理----fopen(),fclose(),feof(),fgets(),fgetc()

    fopen() 函数用于在 PHP 中打开文件. 打开文件 fopen() 函数用于在 PHP 中打开文件. 此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件: < ...

  4. bash编程-正则表达式

    正则表达式与通配符有部分相似之处,但正则表达式更复杂也更强大. 通配符用于(完全)匹配文件名,支持通配符的命令有:ls.find.cp等: 正则表达式用于在文件中(包含)匹配字符串,支持的命令有:gr ...

  5. iOS架构模式浅析

    这是以前旧博客在13年规划写的一个系列,写了一部分内容,还没有完成.现在重新整理编写.计划从基础知识六大设计原则.设计模式中类的关系开始,然后会对iOS开发中的常用架构模式进行介绍,最后对GoF的23 ...

  6. Swift学习目录

    本学习基于苹果官方Swift学习材料,保留了原版90%左右的内容(一些项目开发中基本不用的知识点没有整理),并根据理解进行整理.如对原版感兴趣,可以直接单击链接阅读和学习. 第一部分 基础篇 1.基本 ...

  7. MFC TabCtrl 控件修改标签尺寸

    注意:无论那种方法,都要先设置Tab控件的Style属性为fixed width. 第一种方法 MFC,tabcontrol控件改变标签大小 - CSDN博客 https://blog.csdn.ne ...

  8. kaldi的TIMIT实例二

    ============================================================================ MonoPhone Training & ...

  9. 另一个画风的GSS1 - Can you answer these queries I(猫树)

    前言 其实我觉得你看猫锟的解释也看不懂(主要是还有一些不良心的讲解者不讲清楚,当然这里不是针对了qwq) 猫锟链接 Solution 考虑我们的线段树是个啥玩意? 每一层都是一堆区间叠在一起. 我们在 ...

  10. 使用 Navicate 连接 Oracle9i 数据库

    Navicat Premium 是一个可多重连接的数据库管理工具,它可让你以单一程序同時连接到 MySQL.SQLite.Oracle 及 PostgreSQL 数据库,让管理不同类型的数据库更加方便 ...