Postman获取的XML响应全为转义<>字符,HtmlDecode无效如何解决
问题根因
你遇到的转义、外层嵌套<string>节点的问题,和HttpUtility.HtmlDecode()的调用没有关系,核心是返回值的类型传递逻辑完全错位:
- 你的预期是把已经生成的结构化XML对象直接作为XML响应返回
- 但实际代码执行时,你把
XNode转成了字符串,随后把这个纯字符串值传给XmlFormatter做序列化 - ASP.NET Web API的XML序列化器在处理
string类型入参时,会默认按照微软序列化规范,把整个字符串封装为带默认命名空间的<string>根节点,同时将字符串内部的所有XML特殊字符(<、>等)做实体转义。这个序列化步骤发生在你调用HtmlDecode()之后,相当于你刚刚把转义字符解码为正常标签,序列化器又重新把这些标签转回转义字符,自然完全达不到解码的效果。
解决方案
方案1:直接返回XNode结构化对象,移除无意义的字符串转换与解码操作
不要把XNode转成字符串、不要调用HttpUtility.HtmlDecode(),直接把XNode实例作为响应内容传给框架,让XML序列化器直接处理合法的XML结构对象:
string jsonResponse = "{\"methodresponse\":{\"@name\":\"login\",\"@timestamp\":\"2021/04/20 07:49:12.295\",\"result\":{\"@seq\":\"\",\"@errorcode\":6000,\"@errordescription\":\"Unspecified error\",\"extinfo\":null}}}"; XNode responseXml = JsonConvert.DeserializeXNode(jsonResponse, "pkt"); return Content(httpStatusCode, responseXml, Configuration.Formatters.XmlFormatter);
注意:
JsonConvert.DeserializeXNode生成的XNode本身就是符合XML规范的结构化对象,不存在需要解码的转义内容,额外的字符串转换、HtmlDecode操作都是多余且起反作用的。
方案2:必须返回自定义XML字符串时,跳过对象序列化流程
如果场景要求你必须自己组装XML字符串,就不要用XmlFormatter对字符串做二次对象序列化,直接将字符串作为原始响应内容写入:
string rawXmlContent = responseXml.ToString(); var response = new HttpResponseMessage(httpStatusCode) { Content = new StringContent(rawXmlContent, Encoding.UTF8, MediaTypeHeaderValue.Parse("application/xml")) }; return response;
这种模式下框架不会对字符串做类型封装、不会额外添加<string>根节点,也不会重复转义内容中的特殊字符。
排查校验点
- 检查传给
Content方法的第二个参数类型:只要传入的是string类型,就必然会触发当前遇到的转义、节点嵌套问题 - 移除所有在XML结构生成完成后调用的
HttpUtility.HtmlDecode()逻辑:XNode生成的XML内容本身符合语法规范,解码操作只会破坏标签结构,且因为后续序列化的转义逻辑,完全无法达到你预期的展示效果 - 可以提前清理JSON源数据中的多余空格,比如原JSON里timestamp值前后的冗余空格,避免最终生成的XML属性带有无意义的格式瑕疵。
内容的提问来源于stack exchange,提问作者gary
相关产品推荐
相关产品推荐

