You need to enable JavaScript to run this app. Postman获取的XML响应全为转义<>字符,HtmlDecode无效如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 07:36:07