MVC模式下xml文件的解析
第一次写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文件的解析的更多相关文章
- JAVA读取XML文件并解析获取元素、属性值、子元素信息
JAVA读取XML文件并解析获取元素.属性值.子元素信息 关键字 XML读取 InputStream DocumentBuilderFactory Element Node 前言 最 ...
- JDOM方法实现对XML文件的解析
首先要下载JDOM.jar包,下载地址:http://download.csdn.net/detail/ww6055/8880371 下载到JDOM.jar包之后导入到工程中去. 实例程序: book ...
- MVC模式下My97DatePicker日期控件引用注意事项
My97DatePicker日期控件之前在用webform模式开发的时候,只要 <script language="javascript" type="text/j ...
- MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据
看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...
- 类的反射及xml文件的解析
类的反射 xml文件的解析 .properties||.xml配置文件的创建及读取内容 //创建对象 Properties properties = new Properties(); //存储 pr ...
- 用SAX和PULL进行XML文件的解析与生成
XML解析有传统的dom方法还有Jsoup,SAX,PULL等,这里讲的是比较省内存的SAX和PULL方法.Android中极力推荐用PULL的方式来解析,我个人觉得pull确实比较简单,但其内部的逻 ...
- 【文件处理】xml 文件 DOM解析
一.Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath 此文针对其中的DOM方法具体展开介绍及代码分析 sax.dom是两种对xml文档进行解析的方法(没有具体实 ...
- 【案例分享】使用ActiveReports报表工具,在.NET MVC模式下动态创建报表
提起报表,大家会觉得即熟悉又陌生,好像常常在工作中使用,又似乎无法准确描述报表.今天我们来一起了解一下什么是报表,报表的结构.构成元素,以及为什么需要报表. 什么是报表 简单的说:报表就是通过表格.图 ...
- 在MVC模式下通过Jqgrid表格操作MongoDB数据
看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...
随机推荐
- 驱动里执行应用层代码之KeUserModeCallBack(WOW64是由三个动态库wow64.dll wow64win.dll wow64cpu.dll来实现)
在驱动层(ring0)里执行应用层(ring3)代码,这是个老生常谈的技术,而且方法也挺多. 这种技术的本质:其实就是想方设法在驱动层里把应用层代码弄到应用层去执行. 比如在APC异步调用中,KeIn ...
- fmt命令
简单的格式化文本 fmt [option] [file-list] fmt通过将所有非空白行的长度设置为几乎相同,来进行简单的文本格式化 参数 fmt从file-list中读取文件,并将其内容的格式化 ...
- PHP 错误提示
HTTP/1.1 200 OKServer: nginxDate: Thu, 20 Jun 2013 03:06:10 GMTContent-Type: text/html; charset=utf- ...
- DEV控件的使用(二次封装BaseUI)
一:DEV的安装 直接点击exe文件安装,安装完成之后,将控件添加到工具栏,如下图添加即可 二:注意事项 项目使用的是二次封装的BaseUI,有些属性和事件在BaseUI的控件中由于太多不能全部显示, ...
- winPcap_5_打开适配器并捕获数据包
知道如何获取适配器的信息了,那我们就开始一项更具意义的工作,打开适配器并捕获数据包.编写一个程序,将每一个通过适配器的数据包打印出来. 打开设备的函数是 pcap_open(). (Open a ge ...
- CSS padding margin border属性详解【转载】
本文转载自:http://www.cnblogs.com/linjiqin/p/3556497.html ,感谢相关博主. 图解CSS padding.margin.border属性 W3C组织建议把 ...
- Java学习日记-12 集合(2)
一.List<E>接口(超级接口Collection,List比Collection多重载了一些索引作为形参的方法)1.实现类ArrayList\LinkedListArrayList顺序 ...
- python爬虫__第一个爬虫程序
前言 机缘巧合,最近在学习机器学习实战, 本来要用python来做实验和开发环境 得到一个需求,要爬取大众点评中的一些商户信息, 于是开启了我的第一个爬虫的编写,里面有好多心酸,主要是第一次. 我的文 ...
- motan源码分析三:与spring框架的结合
在本文第一章,分析的demo中使用了代码加载的方式加载了相关的类,但在我们的实际工作中,使用spring来加载相关的类的情况会更多,本文将分析一下motan是如何与spring一起协同工作的,主要的原 ...
- iOS常用的开源类库
开发几个常用的开源类库及下载地址: 引用 1.json json编码解码 2.GTMBase64 base64编码解码 3.TouchXML xml解析 4.SFHFKeychainUtils 安全保 ...