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。所以一定是可以的。
我的初步想法:
- 我能否在将字符串传递给之前以某种方式对其进行解码
反序列化?我用
HttpUtility.DecodeHtml
试过了,但我
不要以为我要解码的实际上是 HTML!
- 是否有不同的 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);
}
我正在将一些 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。所以一定是可以的。
我的初步想法:
- 我能否在将字符串传递给之前以某种方式对其进行解码
反序列化?我用
HttpUtility.DecodeHtml
试过了,但我 不要以为我要解码的实际上是 HTML! - 是否有不同的 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);
}