第一次写blog,组织不当和出错的地方还请大家多担当哈。

java操作xml文件的方式中用的较多的有四种,DOM、SAX、JDOM、DOM4J。除第一种外其余的三种我都有试过,这后三种方案中我选择用SAX处理数据库的配置文件,用DOM4J处理我其余的一些数据文件,下面是我的筛选原由:

1) SAX解析器采用了基于事件的模型,分析能够立即开始,不用等待所有的数据被处理,同时也不需要将数据存储在内存中,所以这种解析方式的优点就是快,内存要求低,尤其对大的xml文件来讲。这种解析方式的缺点也很明显,不能随机访问xml文档,修改起来当然也不好实现。

2) JDOM是java特定文档模型,api简化易理解,但自身是没有解析器的,它用的是SAX的,所以是具有SAX的java规则,和DOM一样,它的性能在这四种方式中表现都不是太好。

3) DOM4J最初是JDOM的一个分支,但是它的性能是最好的,其复杂的api支持其对xml文件进行复杂的操作。

数据库配置文件只需要简单的读取,所以我选择SAX,而我要处理的数据xml文件,要做稍微复杂一点的工作,包括读取、添加、删除、修改、重写等,所以选择了DOM4J这种方式。这里我只简单说说我用DOM4J的操作。

在讲这个之前,我再提下我为什么要说MVC开发模式。MVC是web开发中很常用的一个模式,M代表modal是数据的模型与组织,V代表view是展现在用户面前的东西,C代表controller是M和V之间的控制层。我要操作的xml文件是在后台处理的,然后以json的格式传递到前端展示,前端的操作再传递到后台并对xml文件做相应的处理。大体的结构图如下:

视图中上面的html和js代表V,服务器中的Action文件可以理解为C,Factory和Bean可以理解为M,本文中我们重点关注M,其余的两部分就不做讨论了。

xml文件 test.xml:

<?xml version="1.0" encoding="GBK"?>

<jgs>

<jg id="jg1">

<id>1</id>

<len>7</len>

<wid>5</wid>

<hei>14</hei>

</jg>

<jg id="jg2">

<id>2</id>

<len>7</len>

<wid>5</wid>

<hei>14</hei>

</jg>

</jgs>

java代码JGBean.java:

package com.factory;

/**

* JG数据模型

* @author Echo

*/

public class JGBean {

private String id = "";

private String len = "";

private String wid = "";

private String hei = "";

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getWid() {

return wid;

}

public void setWid(String wid) {

this.wid = wid;

}

public String getHei() {

return hei;

}

public void setHei(String hei) {

this.hei = hei;

}

}

实现代码XMLHandler.java

package com.factory;

/**

* xml解析类

* @author Echo

*/

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import net.sf.json.JSONObject;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.SAXReader;

import org.dom4j.io.XMLWriter;

public class XMLHandler {

private static XMLHandler instance = null;

private List<JGBean> jgList = new ArrayList<JGBean>();

private static Document d = null;

private  String fileName = "test.xml";

public static XMLHandler getInstance(){

if(instance == null){

instance = new XMLHandler();

}

return instance;

}

public XMLHandler(){

if(jgList.size() == 0) loadXML();

}

public void loadXML(){

d = getXMLFile(fileName);

jgList = readXMLFile();

}

public Document getXMLFile(String fileName) {

Document document =null;

try {

SAXReader saxReader =new SAXReader();

File f = new File(getClass().getResource(fileName).getFile());

document = saxReader.read(f); //读取XML文件,获得document对象

} catch (Exception e) {

e.printStackTrace();

}

return document;

}

//读取xml文件元素名称和文本值

@SuppressWarnings("unchecked")

public List<JGBean> readXMLFile() {

Element root =d.getRootElement();

jgList.clear();

Iterator iter = root.elementIterator("jg"); // 获取根节点下的子节点

while (iter.hasNext()) {

JGBean jgb = new JGBean();

Element jg = (Element) iter.next();

jgb.setId(jg.elementTextTrim("id"));

jgb.setLen(jg.elementTextTrim("len"));

jgb.setWid(jg.elementTextTrim("wid"));

jgb.setHei(jg.elementTextTrim("hei"));

jg.setText(" ");

jgList.add(jgb);

}

return jgList;

}

@SuppressWarnings("unchecked")

public void modifyNode(String id){ //修改单个jg节点

Element root = d.getRootElement();

Iterator iter = root.elementIterator("jg"); // 获取根节点下的子节点

while (iter.hasNext()) {

Element jg = (Element) iter.next();

if(jg.getXPathResult(0).getText().equals(id)){

jg.getXPathResult(0).setText(9);//修改id为9

return;

}

}

}

public Element addNode(JSONObject json){ //添加机柜

Element root = d.getRootElement();

Element jg = root.addElement("jg");

Element id = jigui.addElement("id");

id.setText(json.getString("id"));

Element len = jigui.addElement("len");

len.setText(json.getString("len"));

Element wid = jigui.addElement("wid");

wid.setText(json.getString("wid"));

Element hei = jigui.addElement("hei");

hei.setText(json.getString("hei"));

updateDocument();

writeXML(fileName);

return jigui;

}

@SuppressWarnings("unchecked")

public Element deleteNode(String id){//删除机柜

Element root = d.getRootElement();

Iterator iter = root.elementIterator("jg"); // 获取根节点下的子节点

Element e = null;

while (iter.hasNext()) {

Element jg = (Element) iter.next();

if(jg.getXPathResult(0).getText().equals(id)){

e = jg;

root.remove(jg);

break;

}

}

updateDocument();

writeXML(fileName);

return e;

}

@SuppressWarnings("unchecked")

public Element updateNode(JSONObject json){ //修改单个节点

Element root = d.getRootElement();

Iterator iter = root.elementIterator("jg"); // 获取根节点下的子节点

Element e = null;

while (iter.hasNext()) {

Element jg = (Element) iter.next();

     if(jg.getXPathResult(0).getText().equals(json.getString("id"))){

           System.out.println(jg.getXPathResult(0).getText());

e = jg;

break;

}

}

updateDocument();

writeXML(fileName);

return e;

}

@SuppressWarnings("unchecked")

public void updateDocument(){

Element root = d.getRootElement();

Iterator iter = root.elementIterator("jg"); // 获取根节点下的子节点

int index = 0;

String id = "";

while (iter.hasNext()) {

Element jg = (Element) iter.next();

id = ++index + "";

jg.getXPathResult(0).setText(id);

}

}

public void writeXML(String fileName){

OutputFormat format = OutputFormat.createPrettyPrint();

format.setEncoding("GBK"); // 指定XML编码

XMLWriter output;

try {

File f = new File(getClass().getResource(fileName).getFile());

output = new XMLWriter(new FileWriter(f),format);

output.write( d );

System.out.println("xml write success!");

output.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

jgList = readXMLFile(); //重新读取文件,更新list内容

}

}

MVC模式下xml文件的解析的更多相关文章

  1. JAVA读取XML文件并解析获取元素、属性值、子元素信息

    JAVA读取XML文件并解析获取元素.属性值.子元素信息 关键字 XML读取  InputStream   DocumentBuilderFactory   Element     Node 前言 最 ...

  2. JDOM方法实现对XML文件的解析

    首先要下载JDOM.jar包,下载地址:http://download.csdn.net/detail/ww6055/8880371 下载到JDOM.jar包之后导入到工程中去. 实例程序: book ...

  3. MVC模式下My97DatePicker日期控件引用注意事项

    My97DatePicker日期控件之前在用webform模式开发的时候,只要 <script language="javascript" type="text/j ...

  4. MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据

    看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...

  5. 类的反射及xml文件的解析

    类的反射 xml文件的解析 .properties||.xml配置文件的创建及读取内容 //创建对象 Properties properties = new Properties(); //存储 pr ...

  6. 用SAX和PULL进行XML文件的解析与生成

    XML解析有传统的dom方法还有Jsoup,SAX,PULL等,这里讲的是比较省内存的SAX和PULL方法.Android中极力推荐用PULL的方式来解析,我个人觉得pull确实比较简单,但其内部的逻 ...

  7. 【文件处理】xml 文件 DOM解析

    一.Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath 此文针对其中的DOM方法具体展开介绍及代码分析 sax.dom是两种对xml文档进行解析的方法(没有具体实 ...

  8. 【案例分享】使用ActiveReports报表工具,在.NET MVC模式下动态创建报表

    提起报表,大家会觉得即熟悉又陌生,好像常常在工作中使用,又似乎无法准确描述报表.今天我们来一起了解一下什么是报表,报表的结构.构成元素,以及为什么需要报表. 什么是报表 简单的说:报表就是通过表格.图 ...

  9. 在MVC模式下通过Jqgrid表格操作MongoDB数据

    看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...

随机推荐

  1. Java中匿名类的两种实现方式(转)

    使用匿名内部类课使代码更加简洁.紧凑,模块化程度更高.内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到.然而这个不是我说的重点,我说的很简单,就是匿名内部类的两种实现方式 ...

  2. OpenRisc-47-or1200的WB模块分析

    引言 “善妖善老,善始善终”,说的是无论什么事情要从有头有尾,别三分钟热度. 对于or1200的流水线来说,MA阶段是最后一个阶段,也是整条流水线的收尾阶段,负责战场的清扫工作.比如,把运算指令的运算 ...

  3. POJ1088 滑雪(记忆化搜索)

    题目链接. 分析: 状态转移方程 d[i][j] = max(d[i-1][j], d[i+1][j], d[i][j-1], d[i][j+1]). #include <iostream> ...

  4. 【转】Java 中字符串的格式化

    原文网址:http://blog.csdn.net/aimartt/article/details/8307237 参考资料:JDK API 1.6.0 中文文档 1.格式字符串语法 产生格式化输出的 ...

  5. COCI2014-2015CONTEST#7——POLICE

    http://www.hsin.hr/coci/archive/2014_2015/contest7_tasks.pdf [题目描述] 有N个书架,每个书架可以容纳M本书.给出了若干本书,每本书有一个 ...

  6. oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)

    1.简述  1) 两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的.用来连接两张表的表达式组成了连接条件.当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合 ...

  7. puppet report import

    把Puppet报告导入Puppet Dashboard 现在Dashboard正在运行,而我们需要确保它能够获取Puppet报告.完成这项工作有几种方法,开始的时候都是用Rake任务导入旧报告.在/u ...

  8. HDU3631:Shortest Path(Floyd)

    Problem Description When YY was a boy and LMY was a girl, they trained for NOI (National Olympiad in ...

  9. ASP.NET MVC3调用分部视图-PartialView的几种方式(集)

    我们的网页通常会有好几个部分组成,一些公共的区域我们通常会做成PartialView(部分视图),但这些视图并不是完全固定的,所以还是需要 特定的Controller来控制.如果只是静态的html,虽 ...

  10. Ubuntu 13.04 安装 GCC4.8.1

    终于有了完整实现C++11的GCC 4.8.1. 给自己的系统升级吧. 下面的步骤可以安装GCC4.8.1, 内容来自:http://askubuntu.com/questions/312620/ho ...