1.XML解析技术概述

(1)XML解析方式分为两种:dom和sax

    dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种标准方式。

sax: (Simple API for XML) 不是官方标准,但它是 XML 社区其实的标准,差点儿全部的 XML 解析器都支持它。

(2)XML解析器(软件/实现类)

    Crimson(SUN)、Xerces(IBM->APACHE) 、Aelfred2(DOM4J开源组织)

(3)XML解析技术API/开发包(在使用时,一定要导入jar包dom4j-1.6.1.jar。然后右键“Butid Path”)

    Jaxp(SUN/dom/sax)、

Jdom、

dom4j 

以上三种,应该说逐渐递增的好用吧,最简单大莫如dom4j。

2.

DOM4j中。获得Document对象的方式有三种:

(1).读取XML文件,获得document对象(解析)            

            SAXReader reader = new SAXReader();   

           Document   document = reader.read(new File("input.xml"));

(2).解析XML形式的文本,得到document对象

               String text = "<members></members>";     

         Document document = DocumentHelper.parseText(text);

(3).主动创建document对象(创建)

           Document document = DocumentHelper.createDocument();  //创建根节点

                  Element root = document.addElement("members");

3.将文档写入XML文件

(1)文档中全为英文,不设置编码,直接写入的形式.  

    XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));             document.add(rootElement);

       writer.write(document);

       writer.flush(); 

       writer.close();

(2)文档中含有中文,设置编码格式写入的形式.

OutputFormat format =
OutputFormat.createCompactFormat();//以紧凑的方式

OutputFormat of = OutputFormat.createPrettyPrint();//有换行的模式

   OutputStream os = new FileOutputStream("src/cn/itcast/xml/dom4j/car.xml");

     XMLWriter xmlWriter = new XMLWriter(os,format);

或者这样:(输出中文字符的要设置编码方式“utf-8”)

XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(filePath),"UTF-8"),OutputFormat.createPrettyPrint());



     xmlWriter.write(document);

     xmlWriter.close();

4.(1)CRUD的含义:CreateReadUpdateDelete增删查改

  (2)XML解析器有二类。各自是DOM和SAX。

a)DOM一次性将整个XML文件读到内存,形成一个倒状的树形结构

        b)SAX多次将整个XML文件读到内存

        c)Document对象代表XML文件在内存中的映像 

  (3)经常使用的API例如以下:

SAXReader saxReader = new SAXReader(); SAXReader是dom4j的核心类

Document document = saxReader.read("*.xml")

Document.getRootElement()

Element.getName()

Element.elements():取得该元素下的全部直接子元素

  Element.elementText():从一个元素导航到还有一个元素且取出该元素的文本

Element.element("sex")
:从一个元素导航到还有一个元素

Element.attributeValue("id"):取得一个元素相应的属性

Element.addElement("sex").setText("男"):加入新元素,同一时候设置该元素文本的值

OutputFormat format = OutputFormat.createPrettyPrint():使用缩格形式写XML文件

XMLWriter xmlWriter = new XMLWriter(os,format):构造XML写入器

xmlWriter.write(document):将内存中的document对象写入硬盘

firstCarElement.remove(firstCarPriceElement):从直接父元素删除直接子元素

//firstCarPriceElement.getParent().remove(firstCarPriceElement):从直接父元素删除直接子元素

5.代码练习(实现对xml的crud操作,只是在对xml的cud中都蕴含着r,所以并没有单独写r)

xml源文件(student.xml):



<?

xml version="1.0" encoding="UTF-8"?

>

<Person> 

  <Student num="2014072201" > 

    <name>一叶扁舟</name>  

    <age>22</age>  

    <profession>软件project</profession>  

  </Student>  

  <Student num="2014072202"> 

    <name>努力</name>  

    <age>21</age>  

    <profession>软件project</profession>  

    <sex>女</sex> 

  </Student> 

</Person>





測试代码(Demo.java):



package cn.wwh.www.xml.dom4j;





import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.util.List;





import org.dom4j.Attribute;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.SAXReader;

import org.dom4j.io.XMLWriter;

import org.junit.Test;





/**

 *类的作用:採用xml的dom4j解析xml文件,并可以实现(CRUD操作)

 *注意:

 * 1.採用xpp3reader的解析方式

XPP3Reader xpp3Reader = new XPP3Reader();

Document document = xpp3Reader.read(new File(filePath));

不知道为啥不行????

 *

 *

 *@author 一叶扁舟

 *@version 1.0

 *@创建时间: 2014-7-22   上午10:39:47

 */

public class Demo2 {

private final static String filePath = "src/cn/wwh/www/xml/dom4j/student.xml";

// 实现xml属性和元素的添加

@Test

public void create() throws Exception{

// 採用SAXReader的解析方式:

SAXReader saxReader = new SAXReader();

Document document = saxReader.read(new File(filePath));

Element root = document.getRootElement();

// 获取Person下的第一元素Student

Element firstElement = (Element) root.elements().get(0);

// 为第一个Student,加入一个属性id,属性值为:"19920101"

firstElement.addAttribute("id", "19920101");

firstElement.addElement("sex").setText("男");







// 输出根节点下的全部东西

List<Element> elements = root.elements();

System.out.println("根节点下有:"+elements.size()+"元素");

for (Element e : elements) {

// 获取student的属性

Attribute  attribute = e.attribute(0);

System.out.println("标签名:"+e.getName());

System.out.println(e.getName()+"属性
                 值:"+attribute.getData()+"\n" +

"attribute.getName():"+attribute.getName()+"\n" +

"attribute.getText():"+attribute.getText());

// 获取全部的子标签

List<Element> child =  e.elements();

for (Element element : child) {

System.out.println(element.getName()+":"+

element.getText());

}

}

// 将数据写会到xml文件里

OutputStream os = new FileOutputStream(filePath);

OutputFormat of = OutputFormat.createPrettyPrint();

OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");

XMLWriter xmlWrite = new XMLWriter(osw, of);

xmlWrite.write(document);

xmlWrite.flush();

xmlWrite.close();

}

// 实现对xml文件的改动

@Test

public void update() throws Exception{

SAXReader saxReader = new SAXReader();

Document document = saxReader.read(new File(filePath));

Element root =
document.getRootElement();

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

// 获取第一个Student

Element firstStudent  = (Element) root.elements().get(0);

Element sex = firstStudent.element("sex");

// firstStudent.element("sex").setText("女");

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

sex.setText("男");



// 将数据写进xml文件里

OutputStream os = new FileOutputStream(filePath);

OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");

OutputFormat  of =  OutputFormat.createPrettyPrint();



XMLWriter xmlWriter  = new XMLWriter(osw,of);

xmlWriter.write(document);

xmlWriter.flush();

xmlWriter.close();

}



// 实现对xml的删除操作

@Test

public   void delete() throws Exception{

SAXReader reader = new SAXReader();

Document  document = reader.read(new File(filePath));

Element element = document.getRootElement();

Element firstStudent = (Element) element.elements().get(0);

// 获取Student 的属性id

Attribute attribute = firstStudent.attribute("id");

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

firstStudent.remove(attribute);

// firstStudent.remove();

// 删除第一Student下sex的元素:

Element sex = firstStudent.element("sex");

sex.getParent().remove(sex);

// sex.remove(sex);



// 将数据写回文件里

XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(filePath),"UTF-8"),OutputFormat.createPrettyPrint());

writer.write(document);

writer.flush();

writer.close();

}

}



代码測试效果图(只显示的create的效果图):











xml(3)--dom4j实现crud操作的更多相关文章

  1. 【JAVA与DOM4J实现对XML文档的CRUD操作】

    一.简介 1.网上下载DOM4J 1.6.1压缩包,解压开之后,发现几个目录和一个jar文件,jar文件是必须的文件其它目录: docs目录:帮助文档的目录,单击index.html: Quick s ...

  2. xml&dom_sax&dom4j的常见操作

    <? xml version =”1.0” encoding=”GB2312”?> <!-- 学生信息—><?xml-stylesheet type=”text/css” ...

  3. 【JAVA解析XML文件实现CRUD操作】

    一.简介. 1.xml解析技术有两种:dom和sax 2.dom:Document Object Model,即文档对象模型,是W3C组织推荐的解析XML的一种方式. sax:Simple API f ...

  4. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  5. 使用DOM进行xml文档的crud(增删改查)操作<操作详解>

    很多朋友对DOM有感冒,这里我花了一些时间写了一个小小的教程,这个能看懂,会操作了,我相信基于DOM的其它API(如JDOM,DOM4J等)一般不会有什么问题. 后附java代码,也可以下载(可点击这 ...

  6. xml之dom4j解析

    * 使用dom4j解析xml 实例在java520里面 TextDom4j * dom4j,是一个组织,针对xml解析,提供解析器dom4j * dom4j不是javase的一部分,想要使用第一步需要 ...

  7. 【Java EE 学习 44】【Hibernate学习第一天】【Hibernate对单表的CRUD操作】

    一.Hibernate简介 1.hibernate是对jdbc的二次开发 2.jdbc没有缓存机制,但是hibernate有. 3.hibernate的有点和缺点 (1)优点:有缓存,而且是二级缓存: ...

  8. 使用MyBatis对表执行CRUD操作

    一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...

  9. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...

随机推荐

  1. Qt图片显示效率的比较 转

    转http://blog.sina.com.cn/s/blog_5c70dfc80100r257.html 在Qt中处理图片一般都要用到QImage类,但是QImage的对象不能够直接显示出来,要想能 ...

  2. css3 animation 参数详解

    animation: name 2s ease 0s 1 both有人知道这后面的参数都代表什么意思吗 name 就是你创建动画的名称 2S表示的时长 ease表示运动效果 0S表示延迟时间 1表示的 ...

  3. 为什么要用BitSet

    BitSet适用于一类型boolean判断,Java的BitSet在这类型判断中非常高效. 举例说明:在判断前2000万数字中素数个数的程序中,如果使用最基本的素数判断代码: package com; ...

  4. 性能测试之LoardRunner 自动关联

    1.什么是自动关联? 2.实例介绍 以下是详细介绍: 自动化关联:它是VuGen提供的自动化扫描关联处理策略,它的原理是对同一个脚本运行和录制时的服务器返回进行比较,来自动查找变化的部分,并且提示是否 ...

  5. DBA 应该要注意Linux 环境下的一些操作

    DBA 对OS的依赖.一丁点儿也不亚于DB.对于Oracle DBA.尤为突出     DB和OS的感情也与日俱增.耦合度高的让人一度以为这两要劳燕双飞了 例如.Oracle里面. 而且.故障诊断以及 ...

  6. inode结构体成员详解

    概述:inode译成中文就是索引节点,它用来存放档案及目录的基本信息,包含时间.档名.使用者及群组等.inode分为内存中的inode和文件系统中的inode,为了避免混淆,我们称前者为VFS ino ...

  7. centOS设为文本启动方式

    centOS图形界面须要点用系统大量的内存和CPU资源,对于server而言,高效率是最重要的,因此将Centos 默认启动改为文本方式. 在终端中输入: vi /etc/inittab 有段说明文字 ...

  8. WinSock - 建立无连接的通信

    1.建立一个基于对话框的工程,并在第二步中选择WOSA支持 2.建立客户端 (1)在头文件中添加成员变量 public: CSocket m_clientsocket; (2)每隔一秒钟向服务端发送一 ...

  9. 如何在SAS中重新构建限价指令簿(Limit Order Book):使用HashTable

    在之前的一篇日志里(http://blog.csdn.net/u010501526/article/details/8875446),我将重新构建LOB(Limit Order Book)分为了三步 ...

  10. 关于Delphi XE2的FMX的一点点研究之消息篇

    Delphi XE2出来了一阵子了,里面比较抢眼的东西,除了VCLStyle这个换肤的东西之外,另外最让人眼亮的应该是FMX这个东西了.万一的博客上都连载了一票的关于FMX的使用心得了.我还是没咋去关 ...