• 关于前后台DOM树应用


    Dom对象是在程序开发中很实用而且经常会应用到的技术,通过Dom对象可以传递具有树结构的对象,有利用前台页面的诸如树的显示和相应值的处理,本文从两个方面全面解析Dom对象的应用,一是从后台得到完整的Dom形式的字符串后到前台页面组装成Dom对象,二是直接在前台页面上直接组装成一个Dom对象。

    (1)后台可以得到的数据一般也分为两种类型,一是直接读取硬盘上的.xml文件生成的,这种形式可以这样调用:

                DocumentBuilder builder=DocumentBuilderFactory

                  .newInstance().newDocumentBuilder(); 

                Document doc=null;  //这两个类最好用org.w3c.dom.Document

                String rootPath=ZhcxtjCtrlHelp.class.getResource("").toString();            

                doc=builder.parse(rootPath+"ybcxtj.xml");

       在后台得到Doc后如果想取值可以这么调用:

               NodeList convertList=doc.getElementsByTagName(elementName);

                Element thisNode=(Element)convertList.item(0);             

                String nodeContent=thisNode.getAttribute("nodeValue");

       当然方法还有很多,不再赘述。

      后台得到Dom对象的另一种方式或者说情况是有时候只是一串字符串,为了前台页面的显示效果,要将其转成                Dom 对象,这个时候可以这样调用:

               try {

                      builder=DocumentBuilderFactory

                        .newInstance().newDocumentBuilder();

                } catch (ParserConfigurationException e) {

                      e.printStackTrace();

                }

                Document doc=builder.newDocument();

                Element root= doc.createElement("root");

                root.setAttribute("state",state);

                root.setAttribute("message",message);   //state 和message 是你传递过来的参数

                doc.appendChild(root);

      当然,第二种方式可以自己随心所欲的控制生成的Doc的节点,只要自己控制好他们的appendChild关系即可。

    如果要将这个Doc对象传到前台页面,除了ajax可以直接传递Dom对象,类似这样:

               response.setContentType("text/xml;charset=UTF-8");

                PrintWriter out = response.getWriter();

                out.println(dataXml);

                out.flush();

                out.close();

                return null;

     绝大多数情况下,我们还是需要先将Doc对象转换成String,然后传到前台页面的,这个从Dom对象转换成String 的方法是这样的:

                 OutputFormat format;

                 try {

                       format = new OutputFormat(SrcDoc);

                       format.setEncoding("UTF-8");

                       StringWriter stringOut = new StringWriter();

                        XMLSerializer serial = new XMLSerializer(stringOut, format);

                       // org.apache.xml.serialize.OutputFormat;

                       // org.apache.xml.serialize.XMLSerializer;

                        serial.asDOMSerializer();

                       serial.serialize(SrcDoc.getDocumentElement());

                        return stringOut.toString();

                      }catch (Exception e) {

                           return "<ERR/>";

                        }

    这样,就完成了后台组装Dom对象,并以String的形式传到了前台页面。

    通过后台传值的方式如何在前台如何得到后台的Dom对象?除了ajax方式的

             var doc = partxmlhttp.responseXML;//得到dialogmessage Dom对象

       绝大多数情况,我们需要在页面上根据后台传来的String字符串,拼装成一个Dom。这里,我们只讲基于    Windows的Explorer浏览器的Dom生成,因为就Mozilla而言,确实是与Explorer有很大差异的。

       其代码是这样的:

               var thisDom;

              var domxml=document.getElementById("xmlstring").value;  //得到从后台传过来的配置树字符串

               var oDom = new ActiveXObject("MSXML2.DOMDocument.5.0"); //利用内置的ActiveX得到Dom控件

               //MSXML2.DOMDocument.5.0是可选的,根据版本的不同,一般这是最新的

               //因为IE从5.0版本就内嵌了这个Dom的ActiveX控件。

               oDom.async = false; //默认是是异步加载,这里控制是同步加载的方式

               if (strPath != null){         

                  thisDom = oDom.load(strPath) ? oDom : null;

                  //strPath是路径,可以按指定路径来加载

               }else{

                  thisDom = oDom.loadXML(domxml) ? oDom : null;

               }

     

       通过上面的代码,我们就在页面上得到了thisDom这个对象。

    (2)第二种方式就是在前台页面直接new一个Dom对象出来,这种方式是很简单,代码如下:

          var dom= new ActiveXObject("MSXML2.DOMDocument.5.0");

          dom.loadXML("<?xml version='1.0' encoding='utf-8' ?><navi></navi>");

          var root1=dom.createElement("navi");

          root1.setAttribute("prikey","SQ");   

          var node11=dom.createElement("name");

          node11.setAttribute("text","A级");

          node11.setAttribute("value","yhl_aj");

          node11.text="Dimmacro";

          var node12=dom.createElement("name");

          node12.setAttribute("text","B级");

          node12.setAttribute("value","yhl_bj");

          root1.appendChild(node11);root1.appendChild(node12);

          var root2=dom.createElement("navi");

          root2.setAttribute("prikey","SB");

          var node21=dom.createElement("name");

          node21.setAttribute("text","B级");

          node21.setAttribute("value","bzl_bj");   

          root2.appendChild(node21);

          dom.documentElement.appendChild(root1);

          dom.documentElement.appendChild(root2);

     

      通过这种手动设置的方式,我们就可以创建一个Dom对象了。

     

     

     

     

     

     

     

     

     

     

     

     

               





  • 相关阅读:
    SQL 2012 Group By Rollup, Grouping
    SQL 2012 Restore HeaderOnly
    EasyPerformanceCounterHelper
    并发异步处理队列 .NET 4.5+ (改进性能计数器) 2013-11-16
    CodeTimerPerformance EasyPerformanceCounterHelper .NET 4.5
    csc.rsp Nuget MVC/WebAPI 5.0、SignalR 2.0、Rx、Json、Azure、EntityFramework、OAuth、Spatial
    MEF Parts Sample
    免费超高速卡片式病人基本信息列表控件
    微观云计算系列谈之一:基本概念
    golang 无法将Slice类型[]a 转换为 Slice[]b
  • 原文地址:https://www.cnblogs.com/dimmacro/p/4460860.html
Copyright © 2020-2023  润新知