2012-04-16 60 views
0

下面是相关的(C#.NET)代码:为什么我的Web服务响应XML包含转义字符以及它们应该如何处理?

WebRequest webRequest = System.Net.WebRequest.Create(authenticationUrl); 

UTF8Encoding encoding = new UTF8Encoding(); 

... 

var webResponse = webRequest.GetResponse(); 
var webResponseLength = webResponse.ContentLength; 
byte[] responseBytes = new byte[webResponseLength]; 

webResponse.GetResponseStream().Read(responseBytes, 0, (int)webResponseLength); 
var responseText = encoding.GetString(responseBytes); 
webResponse.Close(); 

这里是什么responseText值样子(在调试上面的代码从Visual Studio中复制):

"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<responseblock version=\"3.67\">\n <requestreference>X3909254</requestreference>\n <response type=\"ERROR\">\n <timestamp>2012-04-16 13:53:59</timestamp>\n <error>\n  <message>Invalid field</message>\n  <code>30000</code>\n  <data>baseamount</data>\n </error>\n </response>\n</responseblock>\n" 

为什么有似乎在回应中转义字符(例如\")?这是由于我将响应流转换为字符串的方式吗?我应该怎么做(以便存储在变量responseText中的值可以被解析为'标准'XML)?

UPDATE - 更多的代码,我用:

var resultXML = XElement.Parse(responseText); 

... 


int errorCode = (int)(resultXML.Element("error").Element("code")); 

的问题是,该元件error不是resultXML根元素的直接子,因此,我显然无法引用error(或其子元素code)。

回答

2

只有在调试时才会看到这些字符。我猜目的是你可以复制整个字符串并将其直接插入到C#代码中进行进一步测试。而且,它能够将整个字符串表示为一行。

但是当您访问代码中的字符串时,所有\n都将被转换为真正的换行符。所以你可以安全地解析它。

P.S.你为什么手动调用Web请求?如果您在解决方案树中使用“添加Web引用”功能,Visual Studio将为您生成存根代码。然后,您不必关心XML - 您将使用Visual Studio根据WSDL描述生成的对象。

+0

你是对的!事实证明,我的问题是,我试图直接访问一个本身不是相关根元素的直接子元素。附: - 我仍然在某种程度上了解Web服务,而且我通常更喜欢使用更多的“原始”构造。但是,感谢关于在Visual Studio中使用Web引用的提醒。我以前用过它们,它们非常有用! – 2012-04-16 14:36:20

+1

实际上,假设您运行的是Visual Studio 2008或更高版本,您应该使用“添加服务引用”,而不是“添加Web引用”。 – 2012-04-16 16:58:37

相关问题