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

        }

    }

  • 相关阅读:
    JVM内存区域类别
    ConcurrentHashMap初探
    一张图理解RACSignal的Subscription过程
    ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
    自己写简单CoreDataManager封装对CoreData操作
    [转]layoutSubviews总结
    [转]日期格式化(yyyy-MM-dd)中,为什么 M 多大写?
    Native App执行JS
    Mac下配置Maven
    Mac OS X中配置Apache
  • 原文地址:https://www.cnblogs.com/echo-yao/p/echo-xml.html
Copyright © 2020-2023  润新知