mxGraph實現拓撲圖拖動。mxGraph提交xml數據,java后台解析


需求:采用mxgraph實現可 拖動 拓撲圖,並將移動后的拓撲圖數據保存入數據庫,供下次顯示時讀取

前台提交數據

Java代碼   收藏代碼
  1. //獲取mxgraph拓撲圖數據  
  2. var enc1 = new mxCodec(mxUtils.createXmlDocument());  
  3. var node1 = enc1.encode(graph.getModel());  
  4. var xml1 = mxUtils.getXml(node1);  
  5.           
  6. //采用dwr的ajax方式向后台提交數據             
  7. TopoService.saveTopoData(xml1,function(result){         //保存結果  
  8. });  

后台解析數據

主要采用dom4j進行xml解析,分兩套方案

Java代碼   收藏代碼
  1. /** 
  2.      * 保存拓撲節點坐標信息 
  3.      * @param userInfo 
  4.      * @return 
  5.      */  
  6.     public int saveTopoData(String xmldata) {   
  7.         int updateResult = 1;  
  8.         Map<String, String> paraMap = new HashMap<String, String>();  
  9.         InputSource in = new InputSource(new StringReader(xmldata));     
  10.         //in.setEncoding("UTF-8");     
  11.         in.setEncoding("GBK");   
  12.         SAXReader reader = new SAXReader();     
  13.         Document document;  
  14.         try {  
  15.             document = reader.read(in);  
  16.             //獲取所有擁有autoSaveNode屬性的mxCell節點  
  17.             System.out.println("===============所有需要保存的節點============");  
  18.             System.out.println("======================方案二========================");  
  19.             //---------------------------方案一-----------------------------------------------------  
  20.             Element rootElt = document.getRootElement(); // 獲取根節點  
  21.             Element rootjd = rootElt.element("root");     
  22.             Iterator rootiter = rootjd.elementIterator("mxCell"); // 獲取根節點下的子節點mxCell  
  23.             while (rootiter.hasNext()) {                   
  24.                 Element recordEle = (Element) rootiter.next();  
  25.                 String autoSaveNode = recordEle.attributeValue("autoSaveNode");  
  26.                 if(autoSaveNode!=null && !"".equals(autoSaveNode)){  
  27.                     System.out.println("==節點允許保存:"+autoSaveNode);  
  28.                     Element xyEle = recordEle.element("mxGeometry");  
  29.                     System.out.println("節點id:"+recordEle.attributeValue("id"));  
  30.                     System.out.println("x坐標:"+xyEle.attributeValue("x"));  
  31.                     System.out.println("y坐標:"+xyEle.attributeValue("y"));  
  32.                       
  33.                     String zbElementX = xyEle.attributeValue("x")==null?"0":xyEle.attributeValue("x");  
  34.                     String zbElementY = xyEle.attributeValue("y")==null?"0":xyEle.attributeValue("y");  
  35.                     if (zbElementX.contains(".")) {  
  36.                         zbElementX = zbElementX.substring(0,zbElementX.indexOf("."));  
  37.                     }  
  38.                       
  39.                     if (zbElementY.contains(".")) {  
  40.                         zbElementY = zbElementY.substring(0,zbElementY.indexOf("."));  
  41.                     }  
  42.                         
  43.                      //節點只是移動了位置   
  44.                     paraMap.put("deviceid",Long.parseLong(recordEle.attributeValue("deviceid"))+"");   
  45.                     paraMap.put("xpoint",zbElementX);   
  46.                     paraMap.put("ypoint",zbElementY);   
  47.                       
  48.                     topoDAO.saveTopoData(paraMap);  
  49.                 }   
  50.             }  
  51.             //-------------------------------------------------------------------------------------  
  52.             //---------------------------方案二-----------------------------------------------------  
  53.             /**String xpath = "//mxCell[@autoSaveNode]"; 
  54.             List<Element> eList = document.selectNodes(xpath);//獲取所有擁有autoSaveNode屬性的mxCell節點 
  55.              
  56.             for (Iterator iterator = eList.iterator(); iterator.hasNext();) { 
  57.                 Element element =  (Element) iterator.next();   
  58.                 Element zbElement =    (Element) element.elements().get(0);//坐標數據節點   
  59.                 System.out.println("節點id:"+element.attributeValue("id")); 
  60.                 System.out.println("x坐標:"+zbElement.attributeValue("x")); 
  61.                 System.out.println("y坐標:"+zbElement.attributeValue("y")); 
  62.                 String zbElementX = zbElement.attributeValue("x")==null?"0":zbElement.attributeValue("x"); 
  63.                 String zbElementY = zbElement.attributeValue("y")==null?"0":zbElement.attributeValue("y"); 
  64.                 if (zbElementX.contains(".")) { 
  65.                     zbElementX = zbElementX.substring(0,zbElementX.indexOf(".")); 
  66.                 } 
  67.                  
  68.                 if (zbElementY.contains(".")) { 
  69.                     zbElementY = zbElementY.substring(0,zbElementY.indexOf(".")); 
  70.                 } 
  71.                    
  72.                  //節點只是移動了位置  
  73.                 paraMap.put("deviceid",Long.parseLong(element.attributeValue("deviceid"))+"");  
  74.                 paraMap.put("xpoint",zbElementX);  
  75.                 paraMap.put("ypoint",zbElementY);  
  76.                  
  77.                 topoDAO.saveTopoData(paraMap); 
  78.                  
  79.             }*/  
  80.               
  81.         } catch (Exception e) {  
  82.             e.printStackTrace();  
  83.               
  84.         } finally {   
  85.             return updateResult;  
  86.               
  87.         }  

 

 

 

方案一性能比較好,因為他直接是

List<Element> eList = document.selectNodes(xpath);//獲取所有擁有autoSaveNode屬性的mxCell節點
直接獲取需要修改的節點,不需要就該的節點將不進行保存

問題:目前windows下正常,但linux上就出問題了,報什么:缺少jaxen.jar神馬的,加入還是不行

方案二性能較差,因為他要遍歷所有的xml節點,如果節點過多,性能明顯會比方案一差


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM