在WebService方法返回XML数据的时候,将XML处理成字符串返回,在flex等客户端得到的XML字符串会出现被转义的情况。一些主要的转义字符如下表:

转义字符 xml特殊字符 符号名
&lt; < 小于号
&gt; > 大于号
&amp; &
&apos; ' 单引号
&quot; " 双引号
 public string QuerySpsGeoDataFromDB(string projNo)
    {
        DataTable table = GeoDataPraser.PraseSps(projNo, "DFOMS", "bgpomsread", "bgpomsread");

        StringWriter sw = new StringWriter();
        XmlTextWriter xw = new XmlTextWriter(sw);
        table.WriteXml(xw, false);



        return sw.ToString();
    } 

在客户端调用得到的字符串如下所示:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<soap:Body>
		<QueryBkGeoDataFromDBResponse xmlns="RichfitWebService">
			<QueryBkGeoDataFromDBResult>&lt;Root&gt;&lt;BK TYPE="1"&gt;&lt;Point X="20433761" Y="4315303" /&gt;&lt;Point X="20447378" Y="4304664" /&gt;&lt;Point X="20458731" Y="4319195" /&gt;&lt;Point X="20448140" Y="4327470" /&gt;&lt;Point X="20446662" Y="4325579" /&gt;&lt;Point X="20445401" Y="4326564" /&gt;&lt;Point X="20442890" Y="4323349" /&gt;&lt;Point X="20441124" Y="4324728" /&gt;&lt;/BK&gt;&lt;BK TYPE="3"&gt;&lt;Point X="20435117" Y="4315284" /&gt;&lt;Point X="20446717" Y="4306222" /&gt;&lt;Point X="20457060" Y="4319460" /&gt;&lt;Point X="20448486" Y="4326159" /&gt;&lt;Point X="20447008" Y="4324268" /&gt;&lt;Point X="20445748" Y="4325253" /&gt;&lt;Point X="20443236" Y="4322037" /&gt;&lt;Point X="20441471" Y="4323417" /&gt;&lt;/BK&gt;&lt;BK TYPE="4"&gt;&lt;Point X="20431827" Y="4315735" /&gt;&lt;Point X="20447950" Y="4303139" /&gt;&lt;Point X="20460349" Y="4319009" /&gt;&lt;Point X="20447253" Y="4329242" /&gt;&lt;Point X="20445775" Y="4327350" /&gt;&lt;Point X="20444514" Y="4328335" /&gt;&lt;Point X="20442002" Y="4325120" /&gt;&lt;Point X="20440237" Y="4326499" /&gt;&lt;/BK&gt;&lt;BK TYPE="2"&gt;&lt;Point X="20429893" Y="4316167" /&gt;&lt;Point X="20448522" Y="4301613" /&gt;&lt;Point X="20461968" Y="4318823" /&gt;&lt;Point X="20446365" Y="4331013" /&gt;&lt;Point X="20444888" Y="4329122" /&gt;&lt;Point X="20443627" Y="4330107" /&gt;&lt;Point X="20441115" Y="4326892" /&gt;&lt;Point X="20439350" Y="4328271" /&gt;&lt;/BK&gt;&lt;/Root&gt;</QueryBkGeoDataFromDBResult>
		</QueryBkGeoDataFromDBResponse>
	</soap:Body>
</soap:Envelope>

 

如何在客户端将带有这些转义字符的字符串翻译成标准XML,以Flex为例,可使用替换的方法将转移字符转换成标准XML字符。

解决的办法就是在取出来之后把XML中的特殊字符再转义回去。
代码如下:

var reg1:RegExp = /&lt;/gi; 
str = str.replace(reg1,"<"); 
var reg2:RegExp = /&gt;/gi; 
str = str.replace(reg2,">"); 
var reg3:RegExp = /&apos;/gi; 
str = str.replace(reg3,"'"); 
var reg4:RegExp = /&quot;/gi; 
str = str.replace(reg4,"\""); 
var reg5:RegExp = /&#xD;/gi; 
str = str.replace(reg5,"\r"); 
var reg6:RegExp = /&amp;/gi; 
str = str.replace(reg6," "); 
var reg7:RegExp = /&#x9;/gi; 
str = str.replace(reg7," ");
之所以出现这样的问题,是因为STring类型和XML在webservice序列化过程中的处理方法不同。
如果返回可序列化的标准XML对象,可根本上解决转义问题,对应代码修改为:
[WebMethod, SoapHeader("soapHeader")]
    public System.Xml.XmlDocument QuerySpsGeoDataFromDB(string projNo)
    {
        DataTable table = GeoDataPraser.PraseSps(projNo, "DFOMS", "bgpomsread", "bgpomsread");
        
        StringWriter sw = new StringWriter();
        XmlTextWriter xw = new XmlTextWriter(sw);
        table.WriteXml(xw, false);

        System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();
        xmldoc.LoadXml(sw.ToString());

        return xmldoc;
    }
posted on 2011-01-05 11:20  GIS飞行者  阅读(22868)  评论(1编辑  收藏  举报