关注技术,重视技术,善用技术

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

xml文件中特殊字符的处理
    在XML中,起始和结束标记之间出现的所有合法字符都被忠实地传给XML处理程序。 为了避免把字符数据和标记中需要用到的一些特殊符号相混淆,XML还提供了一些有用的 实体引用。实体引用的作用是,当在字符数据中需要使用这些特殊符号时,我们采用它的 实体引用来代替。这些特殊的XML实体引用包括:

> >

< &lt;

& &amp;

" &quot;

’&apos;

    这样,如果我们需要在"示例"这个标记中出现文本

"<姓名>张三</姓名>"

    正确的写法应该是:

示例〉&lt;姓名&gt;张三&lt;/姓名&gt;〈/示例〉

    容易理解,字符"〈"的实体引用是必不可少的,为"〉"设立实体引用同样是为了避免与标记混淆,而字符"&"的实体引用则防止它与实体引用中开头所用的"&"相混淆。那么,我们什么时候需要用到剩下两个字符的实体引用呢?在标记中可以为标记设立属性,而XML规定属性值必须用"""括起来。因此,当属性值中出现字符"""时,需要将它用实体引用代替。请看下面的例子:

<STATEMENT VALUE = "She said, "Don t go there!"">

    正确的写法应该是:

<STATEMENT VALUE = "She said, "Don&apos;t go there!"">




还有一个方法,用<![CDATA[显示的内容]]>

如:
<?xml version="1.0">
<T>
<![CDATA[测试各种不同的符号,;'" &]]>
</>


XMLHTTP应用参考

一、使用步骤:
1、创建XMLHTTP对象 //需MSXML4.0支持
2、打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等。客户端通过Open命令打开与服务端的服务网页的连接。与普通HTTP指令传送一样,可以用"GET"方法或"POST"方法指向服务端的服务网页。
3、发送指令。
4、等待并接收服务端返回的处理结果。
5、释放XMLHTTP对象
 
二、XMLHTTP方法:
Open( bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword )
bstrMethod:  数据传送方式,即GET或POST。
bstrUrl:     服务网页的URL。
varAsync:   是否同步执行。缺省为True,即同步执行,但只能在DOM中实施同步执行。用中一般将其置为False,即异步执行。
bstrUser:    用户名,可省略。
bstrPassword:用户口令,可省略。
 
Send( varBody )
varBody:指令集。可以是XML格式数据,也可以是字符串,流,或者一个无符号整数数组。也可以省略,让指令通过Open方法的URL参数代入。
 
setRequestHeader( bstrHeader, bstrvalue )
bstrHeader:HTTP 头(header)
bstrvalue: HTTP 头(header)的值 

如果Open方法定义为POST,可以定义表单方式上传:
xmlhttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded")
 
三、XMLHTTP属性:
onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。
responseBody:    结果返回为无符号整数数组。
responseStream:   结果返回为IStream流。
responseText :    结果返回为字符串。
responseXML:    结果返回为XML格式数据。

四、示例:
< script language="javascript" >
function getDatal(url){
    var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.4.0");//创建XMLHTTPRequest对象,需MSXML4.0支持 ["MSXML2.XMLHTTP.4.0","MSXML2.DOMDocument.4.0"]
    xmlhttp.open("POST",url,false,"","");   //使用HTTP GET初始化HTTP请求
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") ;
    xmlhttp.send("param=aa");                   //发送HTTP请求并获取HTTP响应
    return xmlhttp.responseText;         //获取返回结果字符串
}
< /script >


完整的无刷新XMLHTTP实现二级联动下拉框的完整示例
以下为页面代码:

<form id="Form1" method="post" runat="server">
<asp:DropDownList id="DropDownList1" runat="server"></asp:DropDownList>
<asp:DropDownList id="DropDownList2" runat="server"></asp:DropDownList>
<SCRIPT LANGUAGE="JavaScript">
<!--
//以XML求取数据
function XmlPost(obj)
{
  var svalue = obj.value;
  var webFileUrl = "?brc_id=" + svalue;
  var result = "";
  var xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
  xmlHttp.open("POST", webFileUrl, false);
  xmlHttp.send("");
  result = xmlHttp.responseText;
  
  if(result != "")
  {
    document.all("DropDownList2").length=0;
    var piArray = result.split(",");
    for(var i=0;i<piArray.length;i++)
    {
      var ary1 = piArray[i].toString().split("|");
      //alert(ary1[0].toString());
      document.all("DropDownList2").options.add(new Option(ary1[1].toString(),ary1[0].toString()));
    }
  }
  else
  {
    alert(result);
  }
}
//-->
</SCRIPT>    
</form>



XMLHTTP应用的一个实例

1、客户端:
function callXMLHttp()
    {
    var strurl;
    var result;
       
    strurl = XMLHttpServer.aspx?strID=100;
   
    var objHttp = new ActiveXObject(Microsoft.XMLHTTP);
   
    objHttp.open(get, strurl, false);
    objHttp.send();
   
    result = objHttp.ResponseText;
    }

2、服务器端:
private void Page_Load(object sender, System.EventArgs e)
{
if (Request.QueryString.Keys.Count > 0 && Request.QueryString[strID].Length > 0)
            {
                strID = Request.QueryString[strID].ToString();
            }

            Response.Write(要返回的值);
}

 

还有一种写法:
function Test(objSrc,objDes)
    {
        try {
            xmlHttp = new ActiveXObject(Microsoft.XMLHTTP);
        } catch(e) {
            xmlHttp = new XMLHttpRequest();
        }

        xmlHttp.onreadystatechange = function() {
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                    var data = xmlHttp.responseText;
                    document.getElementById(objDes).value = data;
                }
            }
        }

        xmlHttp.open(GET,CodeNameServer.aspx?testid= + objSrc.value);
        xmlHttp.send(null);
    }





XMLHTTP---介绍

MSXML中提供了Microsoft.XMLHTTP对象,能够完成从数据包到Request对象的转换以及发送任务。
创建XMLHTTP对象的语句如下:
Set objXML = CreateObject(Msxml2.XMLHTTP) 或
Set objXML = CreateObject(“Microsoft.XMLHTTP”)
' Or, for version 3.0 of XMLHTTP, use:
' Set xml = Server.CreateObject(MSXML2.ServerXMLHTTP)
对象创建后调用Open方法对Request对象进行初始化,语法格式为:
poster.open http-method, url, async, userID, password
Open方法中包含了5个参数,前三个是必要的,后两个是可选的(在服务器需要进行身份验证时提供)。参数的含义如下所示: 
http-method: HTTP的通信方式,比如GET或是 POST
url: 接收XML数据的服务器的URL地址。通常在URL中要指明 ASP或CGI程序
async: 一个布尔标识,说明请求是否为异步的。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作
userID 用户ID,用于服务器身份验证
password 用户密码,用于服务器身份验证
XMLHTTP对象的Send方法
用Open方法对Request对象进行初始化后,调用Send方法发送XML数据:
poster.send XML-data
Send方法的参数类型是Variant,可以是字符串、DOM树或任意数据流。发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。
XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示:
值 说明
0 Response对象已经创建,但XML文档上载过程尚未结束
1 XML文档已经装载完毕
2 XML文档已经装载完毕,正在处理中
3 部分XML文档已经解析
4 文档已经解析完毕,客户端可以接受返回消息
客户机处理响应信息
客户机接收到返回消息后,进行简单的处理,基本上就完成了C/S之间的一个交互周期。客户机接收响应是通过XMLHTTP对象的属性实现的:
● responseTxt:将返回消息作为文本字符串;
● responseXML:将返回消息视为XML文档,在服务器响应消息中含有XML数据时使用;
● responseStream:将返回消息视为Stream对象

------就是下面这个很简单的JAVASCRIPT函数SEND(STR,URL)---------------
使用到的是XMLDOM和XMLHTTP对象.用这种技术的好处是:全JS控制,方便/简单,比RDS
或者remote好多了.(前提:服务器端和客户端都必须安装IE5或者更高版本),在俺贴的
那个无刷新在线信息功能使用的也是这种技术.有兴趣的朋友可以看看..
function Send(Str,URL)
//STR参数是传入的XML数据,你也可以传入其他文本数据.
//不过这个函数需要服务器端处理之后返回XML数据,你也可以修改一下
//URL参数表示你所要处理数据的ASP文件地址
{
var Http = new ActiveXObject(Microsoft.XMLHTTP) //建立XMLHTTP对象
var Dom = new ActiveXObject(Microsoft.XMLDOM) //建立XMLDOM对象
Http.open(POST,URL,false)
//第一个参数的意思是,用POST方式发送数据.可以大到4MB,也可以换为GET.只能256KB
//第2个参数的意思是数据发送到哪个文件处理
//第3个参数意思是同步或异步方式.TRUE为异步,FALSE为同步
Http.send(Str) //开始发送数据.............嘟嘟..
Dom.async=false //设置为同步方式获取数据
Dom.loadXML(Http.responseText)
//开始获取服务器端处理后返回的数据.我在这里设置必须为XML数据,否则出错.
//你也可以自己修改.使返回的是2进制或者记录集数据.................................
if(Dom.parseError.errorCode != 0) //检查是否发生获取数据时错误
{
delete(Http)
delete(Dom)
return(false)
}
else
{
var Back = Dom.documentElement.childNodes.item(0).text
//得到返回的XML数据,我这里假设处理程序只返回一行XML数据(一个节点)
delete(Http)
delete(Dom)
return(Back) //函数返回数据.......................结束
}
}




XMLHTTP下载远程数据输出到浏览器

利用xmlhttp对象获取远程的数据,然后用二进制输出到客户浏览器,让客户下载数据,此例从某一远程服务器获取一个压缩包,并且输出到浏览器提供客户下载.

  程序代码:
  <%
  Response.Buffer = True
  Dim objXMLHTTP, xml
  Set xml = Server.CreateObject(Microsoft.XMLHTTP) '创建对象
   
  xml.Open GET,http://www.4guysfromrolla.com/webtech/code/mitchell-pres.zip,False '   '设置对象,具体xmlhttp详细使用方法请见:http://www.cnsxml.com/blogview.asp?logID=273  《XMLHTTP 对象及其方法》一文

  xml.Send '发送请求
   
  Response.AddHeader Content-Disposition, attachment;filename=mitchell-pres.zip  '添加头给这个文件
   
  Response.ContentType = application/zip '设置输出类型
   
  Response.BinaryWrite xml.responseBody ’输出二进制到浏览器

  Set xml = Nothing
  %>



在.NET中利用XMLHTTP下载文件

using MSXML2;

下面就是主要的代码:

private void Page_Load(object sender, System.EventArgs e)

 string Url = http://dotnet.aspx.cc/Images/logoSite.gif;
 string StringFileName = Url.Substring(Url.LastIndexOf(/) + 1);
 string StringFilePath = Request.PhysicalApplicationPath;
 if(!StringFilePath.EndsWith(/)) StringFilePath += /;
 MSXML2.XMLHTTP _xmlhttp = new MSXML2.XMLHTTPClass();
 _xmlhttp.open(GET,Url,false,null,null);
 _xmlhttp.send();
 if( _xmlhttp.readyState == 4 )
 {
  if(System.IO.File.Exists(StringFilePath + StringFileName))
   System.IO.File.Delete(StringFilePath + StringFileName);
  System.IO.FileStream fs = new System.IO.FileStream(StringFilePath + StringFileName, System.IO.FileMode.CreateNew);
  System.IO.BinaryWriter w = new System.IO.BinaryWriter(fs);
  w.Write((byte[])_xmlhttp.responseBody);
  w.Close();
  fs.Close();
  Response.Write (文件已经得到。<br><a href=' + Request.ApplicationPath + StringFileName +' target='_blank'>);
  Response.Write (查看 + StringFileName + </a>);
 }
 else
 Response.Write (_xmlhttp.statusText);
 Response.End();
}






XmlHttp异步获取网站数据的例子

<script>
var oDiv 
var xh  
function getXML()
{
 oDiv = document.all.m
 oDiv.innerHTML = 正在装载栏目数据,请稍侯.......
 oDiv.style.display=
 xh = new ActiveXObject(Microsoft.XMLHTTP)
 xh.onreadystatechange = getReady
 xh.open(GET,a.value,true)
 xh.send()

}

function getReady()
{
 if(xh.readyState==4)
 {
  if(xh.status==200)
  {

   oDiv.innerHTML = 完成
  }
  else
  {
   oDiv.innerHTML = 抱歉,装载数据失败。原因: + xh.statusText
  }
 }
}
</script>
<body>
xmlhttp异步的例子:
URL:<input name=a value=http://www.microsoft.com style=width:600px>
<input onclick=getXML() type=button value=得到源代码>
<input onclick=if(xh && xh.responseText) {alert(xh.responseText);oDiv.innerHTML=xh.responseText} type=button value=显示源代码>
<div id=m></div>


posted on 2006-08-17 20:28  为人民服务而努力  阅读(516)  评论(0编辑  收藏  举报