在WebService方法返回XML数据的时候,将XML处理成字符串返回,在flex等客户端得到的XML字符串会出现被转义的情况。一些主要的转义字符如下表:
转义字符 | xml特殊字符 | 符号名 |
< | < | 小于号 |
> | > | 大于号 |
& | & | 和 |
' | ' | 单引号 |
" | " | 双引号 |
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><Root><BK TYPE="1"><Point X="20433761" Y="4315303" /><Point X="20447378" Y="4304664" /><Point X="20458731" Y="4319195" /><Point X="20448140" Y="4327470" /><Point X="20446662" Y="4325579" /><Point X="20445401" Y="4326564" /><Point X="20442890" Y="4323349" /><Point X="20441124" Y="4324728" /></BK><BK TYPE="3"><Point X="20435117" Y="4315284" /><Point X="20446717" Y="4306222" /><Point X="20457060" Y="4319460" /><Point X="20448486" Y="4326159" /><Point X="20447008" Y="4324268" /><Point X="20445748" Y="4325253" /><Point X="20443236" Y="4322037" /><Point X="20441471" Y="4323417" /></BK><BK TYPE="4"><Point X="20431827" Y="4315735" /><Point X="20447950" Y="4303139" /><Point X="20460349" Y="4319009" /><Point X="20447253" Y="4329242" /><Point X="20445775" Y="4327350" /><Point X="20444514" Y="4328335" /><Point X="20442002" Y="4325120" /><Point X="20440237" Y="4326499" /></BK><BK TYPE="2"><Point X="20429893" Y="4316167" /><Point X="20448522" Y="4301613" /><Point X="20461968" Y="4318823" /><Point X="20446365" Y="4331013" /><Point X="20444888" Y="4329122" /><Point X="20443627" Y="4330107" /><Point X="20441115" Y="4326892" /><Point X="20439350" Y="4328271" /></BK></Root></QueryBkGeoDataFromDBResult> </QueryBkGeoDataFromDBResponse> </soap:Body> </soap:Envelope>
如何在客户端将带有这些转义字符的字符串翻译成标准XML,以Flex为例,可使用替换的方法将转移字符转换成标准XML字符。
解决的办法就是在取出来之后把XML中的特殊字符再转义回去。
代码如下:
var reg1:RegExp = /</gi; str = str.replace(reg1,"<"); var reg2:RegExp = />/gi; str = str.replace(reg2,">"); var reg3:RegExp = /'/gi; str = str.replace(reg3,"'"); var reg4:RegExp = /"/gi; str = str.replace(reg4,"\""); var reg5:RegExp = /
/gi; str = str.replace(reg5,"\r"); var reg6:RegExp = /&/gi; str = str.replace(reg6," "); var reg7:RegExp = /	/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; }