C# - 当标记之间的空格被分隔时反序列化

C# - Deserializing when whitespace between tags is delimited

我正在将一些 XML 发布到 AWS 中的 API 网关方法,它集成了 SNS。然后 SQS 队列订阅该主题;我有一个 C# 进程间歇性地轮询队列并需要反序列化 XML.

问题是,XML 标签之间的空白最终在某处沿行编码,因此制表符变为 \t,新行变为 \r\n。但这些最终会成为字符串中的 物理标记

示例 XML 发布到 API 网关:

<?xml version="1.0" encoding="utf-8"?>
<ProfileInformation>
    <Username>bgs264</Username>
</ProfileInformation>

从 SQS 队列中读取的字符串:

<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ProfileInformation>\n\t<Username>bgs264</Username>\n</ProfileInformation>

请注意,声明中的属性以 \" 结尾,张贴的空格以 \t\r\n 等结尾。

然而这些不是 "the strings appearing as such in the debugger, but it's actually a tab",它们 在字符串中实际上是这样

所以当我尝试反序列化时,使用

using (var reader = new StringReader(message))
   var myObj = serializer.Deserialize(reader) as ProfileInformation);

我得到:

InvalidOperationException: XML 文档 (1, 15) 中存在错误。

它指的是声明中的第一个\字符,如version=\"1.0\"

我的直接想法是简单地 string.Replace \t 到空字符串等,但这是不可接受的,因为用户的用户名实际上是 bgs\t264 并且替换可能是有效的这里会导致不一致。在这个例子中,我假设我会在消息中得到 bgs\t264,所以替换会错误地离开我,例如 bgs4

所以我需要修复 \n\t 个字符,它们出现在 XML 个标签之间。

为了它的价值,我还有一个用 Go 编写的 lambda,它对此没有问题,只是将完全相同的字符串直接反序列化为 XML。所以一定是可以的。

我的初步想法:

我猜,一些谷歌搜索似乎支持该理论,即您看到的消息已转换为 JSON 并且转义序列是其结果。

理想的方法是调查并防止这种情况发生。我对 SNS 的了解还不够多,无法提供建议,您表示这不是首发,因此最简单的方法是在收到消息后撤消此过程。

您可以使用像 Json.NET 这样的 JSON 库来执行此操作:

var jsonString = string.Format("\"{0}\"", message);

var xmlString = JsonConvert.DeserializeObject<string>(jsonString);

using (var reader = new StringReader(xmlString))
{
   var profileInformation = (ProfileInformation) serializer.Deserialize(reader);
}