java对xml文件的操作_# java对xml文件的基本操作

下面是简单的总结三种常用的java对xml文件的操作

1. dom方式对xml进行操作,这种操作原理是将整个xml文档读入内存总,在内存中进行操作,当xml文档非常庞大的时候就会出现内存溢出的异常,这种方式可以进行增删改查的操作。

2. sax方式进行xml的操作,这种方式则不是将整个xml文档读入到内存中进行操作,sax的操作方式是实时将文档中的数据进行处理,这种方式是一个标签一个标签的进行读取,然后由程序员去实现一个自定义的操作,那么这里需要去实现ContentHandler这个接口中的方法,但是这种方式只能读取xml中的数据,效率快,不占用太大内存。

3. dom4j这是有第三方提供的一种解析方式,我们需要去下载dom4j.jar才能进行使用,这种方式结合了前两种的一些优势,也是比较常用的一种解析方式。

一、dom对xml的基本操作

科学怪人书名>

张三作者>

20.0元售价>

书>

java书名>

扎笑道作者>

书>

书架>

下面这个例子就是简单操作xml的例子:

要求:对上面这个xml文件进行操作

package com.cn.ljh.jaxpxml;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerException;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

public class JaxpXml {

public static void main(String [] args) throws Exception{

//1、创建一个工厂类

DocumentBuilderFactory doucumentfactory = DocumentBuilderFactory.newInstance();

//2、创建一个解析器

DocumentBuilder builder = doucumentfactory.newDocumentBuilder();

Document document = builder.parse("src/Books.xml");

test7(document);

}

//1、在第一个元素上在增加一个子元素

public static boolean test1(Document document) throws Exception{

//先创建一个新的元素

Element element = document.createElement("内部价");

element.setTextContent("1元");

//获得父节点

Node node = document.getElementsByTagName("书").item(0);

//将新创建的节点添加上去

node.appendChild(element);

//将内存中的数据写入到硬盘

TransformerFactory factory = TransformerFactory.newInstance();

Transformer transformer = factory.newTransformer();

transformer.transform(new DOMSource(document), new StreamResult("src/Books.xml"));

return true;

}

//2、在第一个元素的第一个子元素前面增加一个兄弟元素

public static boolean test2(Document document) throws TransformerException {

//创建一个新的元素

Element element = document.createElement("笔名");

element.setTextContent("大侠");

//获取插入位置的元素

Node node = document.getElementsByTagName("书名").item(0);

System.err.println(node.getTextContent());

node.insertBefore(element, node);

//node.appendChild(element);

//将内存中的数据写入到硬盘上

TransformerFactory factory = TransformerFactory.newInstance();

factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml"));

return true;

}

//3、删除第一个元素的第一个子元素

public static boolean test3(Document document) throws Exception{

//得到第一个节点

Node node = document.getElementsByTagName("内部价").item(0);

//获得父节点

node.getParentNode().removeChild(node);

//将内存中的数据写入硬盘中

TransformerFactory factory = TransformerFactory.newInstance();

factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml"));

return true;

}

//4、删除第一个元素

public static boolean test4(Document document){

Node node = document.getElementsByTagName("书").item(0);

node.getParentNode().removeChild(node);

TransformerFactory factory = TransformerFactory.newInstance();

try {

factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml"));

} catch (TransformerException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return true;

}

//5、在第二个元素上增加属性

public static void test5(Document document) throws Exception{

Node node = document.getElementsByTagName("书").item(0);

Element element = (Element) node;

element.setAttribute("出版社","四川出版社");

//将文件写入硬盘

TransformerFactory factory = TransformerFactory.newInstance();

factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml"));

}

//6、删除第一个元素的属性

public static void test6(Document document) throws Exception{

//获得第一个节点

Node node = document.getElementsByTagName("书").item(0);

Element element = (Element) node;

element.removeAttribute("出版社");

TransformerFactory factory = TransformerFactory.newInstance();

factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml"));

}

//7、增加一个新的完整的元素,这个元素有三个子元素,并且添加一个属性

public static void test7(Document document) throws Exception{

//创建一个新的元素

Element oneE = document.createElement("书");

Element towE = document.createElement("书名");

towE.setTextContent("java");

Element towW = document.createElement("作者");

towW.setTextContent("扎笑道");

//获取父节点(书架)

Node node = document.getFirstChild();

node.appendChild(oneE);

oneE.appendChild(towE);

oneE.appendChild(towW);

TransformerFactory factory = TransformerFactory.newInstance();

factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml"));

}

//8、获取第一个元素的第一个子元素的内容

public static boolean test8(Document document){

NodeList nodelist = document.getElementsByTagName("书名");

Node node = nodelist.item(0);

String name = node.getTextContent();

System.out.println(name);

return false;

}

//9、获取属性内容

public static void test9(Document document){

NodeList nodelist = document.getElementsByTagName("书");

Node node = nodelist.item(0);

Element element = (Element) node;

String attName = element.getAttribute("id");

System.out.println(attName);

}

//10、循环遍历打印标签内容

public static void test10(Node node){

//判断是不是Node类型

short type = node.getNodeType();

if(type == Node.ELEMENT_NODE){

System.out.println(node.getNodeName());

}

NodeList nodelist = node.getChildNodes();

long len = nodelist.getLength();

for(int i=0;i

Node n = nodelist.item(i);

test10(n);

}

}

//11、修改第一本书的书名的内容

public static boolean test11(Document document) throws Exception{

//得到第一本书

NodeList nodelist = document.getElementsByTagName("书名");

//得到第一本书的书名元素

Node node = nodelist.item(0);

node.setTextContent("商人");

//将内存中的数据写到硬盘上

TransformerFactory factory = TransformerFactory.newInstance();

factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml"));

return true;

}

}

二、sax对xml的基本操作

捉妖记

2015

许诚毅

老炮儿

冯小刚

2016

下面这个例子就是sax对xml的基本操作:

要求:对上面的xml文件进行内容读取,然后进行数据的封装

数据封装类

package com.cn.ljh.sax;

public class Movie {

private String name;

private String time;

private String director;

public Movie(){

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTime() {

return time;

}

public void setTime(String time) {

this.time = time;

}

public String getDirector() {

return director;

}

public void setDirector(String director) {

this.director = director;

}

}

sax操作类

package com.cn.ljh.sax;

import java.util.ArrayList;

import java.util.List;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.XMLReader;

import org.xml.sax.helpers.DefaultHandler;

public class SaxTeat {

//现在要求将xml文档中的所有内容读取到movie中进行封装

public static void main(String[] args) throws Exception {

//下面就是sax解析xml的方式

//创建sax解析工厂

SAXParserFactory factory = SAXParserFactory.newInstance();

//创建sax的解析器

SAXParser parser = factory.newSAXParser();

//创建xml读取器

XMLReader reader = parser.getXMLReader();

List movies = new ArrayList();//存储电影数据

//挂载解析器(并实现解析其中的方法)

reader.setContentHandler(new DefaultHandler(){

Movie movie = null;

String tag = null;

//读取到元素开始,执行该方法

public void startElement(String uri, String localName, String qName, Attributes attributes)

throws SAXException {

super.startElement(uri, localName, qName, attributes);

if("movie".equals(qName)){

movie = new Movie();

}

tag = qName;

}

//读取到元素结束,执行该方法

public void endElement(String uri, String localName, String qName) throws SAXException {

super.endElement(uri, localName, qName);

if("movie".equals(qName)){

movies.add(movie);

}

}

//读取到内容,执行该方法

public void characters(char[] ch, int start, int length) throws SAXException {

super.characters(ch, start, length);

if("name".equals(tag)){

movie.setName(new String(ch,start,length));

}

if("time".equals(tag)){

movie.setTime(new String(ch, start, length));

}

if("director".equals(tag)){

movie.setDirector(new String(ch,start,length));

}

tag = null;

}

});

reader.parse("src/movie.xml");

for(Movie m : movies){

System.out.println(m.getName());

System.out.println(m.getDirector());

System.out.println(m.getTime());

}

}

}

可以看到上面,我没有去实现ContentHandler这个接口,我是去继承了DefaultHandler类,这里用到了适配器的设计模式(这样我们可以更加方便的去实现里面的方法)。同时我们也可以看出来,这个类中的方法就像是事件一样的方法,当解析器读到每一个标签或者内容都会触发这些方法,所以,这些方法需要自己去实现。同时,这样操作我们还需要将数据进行封装,这样方便我们以后的操作。

三、dom4j对xml的基本操作

科鲁兹

白色

1500000

10.L

新蒙迪欧

1700000

丰田

黑色

1000000

下面这个例子就是dom4j对xml的基本操作

要求:对上面的xml文件进行一些简单的操作

package com.cn.ljh.Dom4j;

import java.io.FileWriter;

import java.util.List;

import org.dom4j.Attribute;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.Node;

import org.dom4j.io.SAXReader;

import org.dom4j.io.XMLWriter;

import org.junit.Test;

public class Dom4jTest {

// 对cas这个xml文件进行操作,利用dom4j的方式

// 1.得到第一辆车的名字

@Test

public void test1() throws Exception {

SAXReader read = new SAXReader();

// 得到文档树

Document document = read.read("src/cars.xml");

// 得到根元素

Element root = document.getRootElement();

List elements = root.elements("car");

// 得到第一个car元素

Element e = elements.get(0);

// 得到name元素

Element name_E = e.element("name");

String name = name_E.getText();

System.out.println("name= " + name);

}

// 2.得到第二辆车的属性

@Test

public void test2() throws Exception {

// 得到读取器

SAXReader read = new SAXReader();

Document document = read.read("src/cars.xml");

// 得到根元素

Element root = document.getRootElement();

// 得到所有车的元素

List es = root.elements("car");

// 得到第二个车的元素

Element car2 = es.get(1);

Attribute att = car2.attribute("where");

String where = att.getText();

System.out.println("where=" + where);

}

// 3.得到第二辆车的价格

@Test

public void test3() throws Exception {

SAXReader read = new SAXReader();

Document document = read.read("src/cars.xml");

Element root = document.getRootElement();

List cars = root.elements("car");

Element car = cars.get(1);

// 得到价格

Element price = car.element("price");

String text = price.getText();

System.out.println(text);

}

// 4.添加第一辆车一个属性

@Test

public void test4() throws Exception {

SAXReader read = new SAXReader();

Document document = read.read("src/cars.xml");

Element root = document.getRootElement();

List cars = root.elements("car");

Element car = cars.get(0);

// 添加属性

car.addAttribute("time", "2015");

// 将内存中的数据写到硬盘上

XMLWriter writer = new XMLWriter(new FileWriter("src/cars.xml"));

writer.write(document);

writer.close();

String text = car.attribute("time").getText();

System.out.println(text);

}

// 5.删除第一辆车的属性

@Test

public void test5() throws Exception {

SAXReader read = new SAXReader();

Document document = read.read("src/cars.xml");

Element root = document.getRootElement();

List cars = root.elements("car");

Element car = cars.get(0);

// 得到第一辆车的属性

Attribute att = car.attribute("where");

// 删除属性

car.remove(att);

// 将内存中的数据写入到硬盘上

XMLWriter writer = new XMLWriter(new FileWriter("src/cars.xml"));

writer.write(document);

writer.close();

}

// 6.给第一辆车添加油耗元素

@Test

public void test6() throws Exception {

SAXReader reader = new SAXReader();

Document document = reader.read("src/cars.xml");

Element root = document.getRootElement();

List cars = root.elements("car");

Element car = cars.get(0);

// 添加一个元素

car.addElement("oil").addText("10.L");

// 将数据写入到内存中

XMLWriter writer = new XMLWriter(new FileWriter("src/cars.xml"));

writer.write(document);

writer.close();

}

// 7.删除第二辆车的颜色的元素

@Test

public void test7() throws Exception {

SAXReader reader = new SAXReader();

Document document = reader.read("src/cars.xml");

Element root = document.getRootElement();

List cars = root.elements("car");

Element car = cars.get(1);

Element color = car.element("color");

car.remove(color);

// 将数据写入到硬盘上

XMLWriter writer = new XMLWriter(new FileWriter("src/cars.xml"));

writer.write(document);

writer.close();

}

// 8.打印所有的标签内容和名字

@Test

public void test8() throws Exception{

SAXReader reader = new SAXReader();

Document document = reader.read("src/cars.xml");

Element root = document.getRootElement();

//遍历所有元素

print(root);

}

//遍历所有元素的方法

private void print(Element element){

String text_name = element.getName();

String text = element.getText();

System.out.println("name = "+text_name+"text = "+text);

for(int i=0,size = element.nodeCount(); i < size;i++){

Node node = element.node(i);

if(node instanceof Element){

print((Element) node);

}

}

}

// 9.创建一个完整的car,包含属性

@Test

public void test9() throws Exception{

SAXReader reader = new SAXReader();

Document document = reader.read("src/cars.xml");

Element root = document.getRootElement();

Element car = root.addElement("car")

.addAttribute("where", "japan");

car.addElement("name").addText("丰田");

car.addElement("color").addText("黑色");

car.addElement("price").addText("1000000");

//将内存中的数据写入到硬盘中

XMLWriter writer = new XMLWriter(new FileWriter("src/cars.xml"));

writer.write(document);

writer.close();

}

}

那么上面这些例子只是简单的以dom4j的方式进行简单的操作,dom4j的功能还有非常多,当我们需要使用这种方式去操作一个xml的时候可以去研究官方文档。dom4j的操作方式要比上面的两种简单高效。

记录学习的每一步,记录每一次的成长!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值