2007年2月5日

如何方便的显示页面的Xml对象数据

我们在做javascript/ajax开发的时候经常要处理Xml对象数据,有时候我们要跟踪一个这对象的某个节点的值是什么。一种传统的方式就是我们在页面中加入

alert(xxx);
而这样被alert出来的数据由于没有一个xml解析器的帮助当文档比较庞大的时候就很难找到并知道自己需要的部分是否正确。 当然我们也可以使用Visual Studio、Venkman这样的工具进行代码的跟踪。但是这样效率又比较低,影响开发速度。 实际上无论是IE,还是Firefox都可以对一个xml提供一个“树”的解析结构。同时对于弹出一个窗口我们可以用
window.opener
window.opener.xxx
来获取弹出它的父窗口。并可以索引到任何在父窗口全局范围内可以访问到的变量、对象,方法返回值等。 根据上面的思路我们就来实现一个可随时观看页面xml的模型。(注:C#实现) 效果如下: 首先我们创建一个xml.aspx文件在页面加入如下脚本
   function getRequestString(sName){
        
var _arr = location.search.substring(1).split('&');
      
var n= _arr.length;
      
for(var i=0;i<n;i++){      
        
if(_arr[i].split("=")[0]===sName) {
          
var t = _arr[i].split("=")[1];
          
try {
            t 
= decodeURI(t);
          } 
catch (ex){}
          t 
= unescape(t);
          
return t;
        }
      }
      
return null;
      }     
      
        
function FixPrototypeForGecko(){ 
          Object.prototype.__defineGetter__(
"xml"function () {
            
return (new XMLSerializer()).serializeToString(this);
          });
        }
        
        
function loaded()
        {
         
if(window.addEventListener&&!document.all){
             FixPrototypeForGecko();
           }
           
           
        
try{              
            eval(
"var ttt = window.opener."+getRequestString("xml")+";");        
            
if(typeof ttt == "string"){
                document.getElementById(
"xmlFiled").value = "<html><![CDATA[" + ttt + "]]></html>";
            }
else{
                
if(typeof ttt != "undefined") {        
                  document.getElementById(
"xmlFiled").value = ttt.xml;                  
                }
else{
                  document.write(
"父文档并没有这样的数据!");
                  
return;
                }
            }            
          }
catch(e){
            alert(
"发生错误:非法的访问,此页将被关闭!");
            
try{
              window.opener 
= "";
            }
catch(ex){}
            window.close();
            
return;
          }
      
          ttt 
= null;
          document.getElementById(
"Form1").submit();
      }
在body标签上加上
<body onload="loaded();">
然后进入cs文件在Page_Load下加入
if (this.Page.IsPostBack)
      {
        
string _text = "";
        
if (xmlFiled.Value.IndexOf("<?"== 0)
        {
          _text 
= xmlFiled.Value;
        }
        
else
        {
          _text 
= "<?xml version=\"1.0\" ?>" + xmlFiled.Value;
        }
        Response.Write(_text);
        Response.ContentType 
= "text/xml";
        Response.End();      
      }
      
else if (Request["xml"== null || Request["xml"== string.Empty)
      {
        Response.Write(
"参数不正确!");
        Response.End();
      }
在使用的时候只要在要跟踪的文档上加入
function showXml(sXmlVariable){
  
try{
      
var tOpenXml = open("../@Files/xml.aspx?xml="+sXmlVariable);    
    }
catch(ex){
      alert(ex.message);
    }
}
这个方法,在适当的时候调用就可以了,sXmlVariable是一个可以在全局范围内可以访问到的任何变量、对象、方法返回值等。

没有评论: