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内容

    }

}

原文地址:https://www.cnblogs.com/echo-yao/p/echo-xml.html