需求:采用mxgraph實現可 拖動 拓撲圖,並將移動后的拓撲圖數據保存入數據庫,供下次顯示時讀取
前台提交數據
- //獲取mxgraph拓撲圖數據
- var enc1 = new mxCodec(mxUtils.createXmlDocument());
- var node1 = enc1.encode(graph.getModel());
- var xml1 = mxUtils.getXml(node1);
- //采用dwr的ajax方式向后台提交數據
- TopoService.saveTopoData(xml1,function(result){ //保存結果
- });
后台解析數據
主要采用dom4j進行xml解析,分兩套方案
- /**
- * 保存拓撲節點坐標信息
- * @param userInfo
- * @return
- */
- public int saveTopoData(String xmldata) {
- int updateResult = 1;
- Map<String, String> paraMap = new HashMap<String, String>();
- InputSource in = new InputSource(new StringReader(xmldata));
- //in.setEncoding("UTF-8");
- in.setEncoding("GBK");
- SAXReader reader = new SAXReader();
- Document document;
- try {
- document = reader.read(in);
- //獲取所有擁有autoSaveNode屬性的mxCell節點
- System.out.println("===============所有需要保存的節點============");
- System.out.println("======================方案二========================");
- //---------------------------方案一-----------------------------------------------------
- Element rootElt = document.getRootElement(); // 獲取根節點
- Element rootjd = rootElt.element("root");
- Iterator rootiter = rootjd.elementIterator("mxCell"); // 獲取根節點下的子節點mxCell
- while (rootiter.hasNext()) {
- Element recordEle = (Element) rootiter.next();
- String autoSaveNode = recordEle.attributeValue("autoSaveNode");
- if(autoSaveNode!=null && !"".equals(autoSaveNode)){
- System.out.println("==節點允許保存:"+autoSaveNode);
- Element xyEle = recordEle.element("mxGeometry");
- System.out.println("節點id:"+recordEle.attributeValue("id"));
- System.out.println("x坐標:"+xyEle.attributeValue("x"));
- System.out.println("y坐標:"+xyEle.attributeValue("y"));
- String zbElementX = xyEle.attributeValue("x")==null?"0":xyEle.attributeValue("x");
- String zbElementY = xyEle.attributeValue("y")==null?"0":xyEle.attributeValue("y");
- if (zbElementX.contains(".")) {
- zbElementX = zbElementX.substring(0,zbElementX.indexOf("."));
- }
- if (zbElementY.contains(".")) {
- zbElementY = zbElementY.substring(0,zbElementY.indexOf("."));
- }
- //節點只是移動了位置
- paraMap.put("deviceid",Long.parseLong(recordEle.attributeValue("deviceid"))+"");
- paraMap.put("xpoint",zbElementX);
- paraMap.put("ypoint",zbElementY);
- topoDAO.saveTopoData(paraMap);
- }
- }
- //-------------------------------------------------------------------------------------
- //---------------------------方案二-----------------------------------------------------
- /**String xpath = "//mxCell[@autoSaveNode]";
- List<Element> eList = document.selectNodes(xpath);//獲取所有擁有autoSaveNode屬性的mxCell節點
- for (Iterator iterator = eList.iterator(); iterator.hasNext();) {
- Element element = (Element) iterator.next();
- Element zbElement = (Element) element.elements().get(0);//坐標數據節點
- System.out.println("節點id:"+element.attributeValue("id"));
- System.out.println("x坐標:"+zbElement.attributeValue("x"));
- System.out.println("y坐標:"+zbElement.attributeValue("y"));
- String zbElementX = zbElement.attributeValue("x")==null?"0":zbElement.attributeValue("x");
- String zbElementY = zbElement.attributeValue("y")==null?"0":zbElement.attributeValue("y");
- if (zbElementX.contains(".")) {
- zbElementX = zbElementX.substring(0,zbElementX.indexOf("."));
- }
- if (zbElementY.contains(".")) {
- zbElementY = zbElementY.substring(0,zbElementY.indexOf("."));
- }
- //節點只是移動了位置
- paraMap.put("deviceid",Long.parseLong(element.attributeValue("deviceid"))+"");
- paraMap.put("xpoint",zbElementX);
- paraMap.put("ypoint",zbElementY);
- topoDAO.saveTopoData(paraMap);
- }*/
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- return updateResult;
- }
方案一性能比較好,因為他直接是
List<Element> eList = document.selectNodes(xpath);//獲取所有擁有autoSaveNode屬性的mxCell節點
直接獲取需要修改的節點,不需要就該的節點將不進行保存
問題:目前windows下正常,但linux上就出問題了,報什么:缺少jaxen.jar神馬的,加入還是不行
方案二性能較差,因為他要遍歷所有的xml節點,如果節點過多,性能明顯會比方案一差

