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

C#-标记之间的空格分隔时反序列化,c#,xml-deserialization,string-parsing,C#,Xml Deserialization,String Parsing,我正在向AWS中的API网关方法发布一些XML,该方法与SNS集成。然后,一个SQS队列被订阅到该主题;我有一个C#进程,它间歇性地轮询队列,需要对XML进行反序列化 问题是,XML标记之间的空白最终会沿着行的某个地方编码,因此选项卡变成\t,新行变成\r\n。但这些最终作为字符串中的物理标记 发布到API网关的XML示例: <?xml version="1.0" encoding="utf-8"?> <ProfileInformation> <Userna

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

问题是,XML标记之间的空白最终会沿着行的某个地方编码,因此选项卡变成
\t
,新行变成
\r\n
。但这些最终作为字符串中的物理标记

发布到API网关的XML示例:

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

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

它引用声明中的第一个
\
字符,如
version=\“1.0\”

我的直接想法是简单地
字符串。将
\t
替换为空字符串等,但这是不可接受的,因为用户的用户名实际上是
bgs\t264
可能是有效的,而此处的替换将导致不一致。在本例中,我假设我将在消息中获得
bgs\\t264
,因此替换会错误地将我保留为
bgs\264

因此,我需要修复这些出现在XML标记之间的
\n\t
字符

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

我最初的想法:

  • 在将字符串传递给用户之前,我是否可以对其进行解码 反序列化?我用
    HttpUtility.DecodeHtml
    尝试了这个,但是我 别以为我要解码的是HTML
  • 我是否可以使用另一个XML库来工作

我猜,一些谷歌搜索似乎支持这一理论,即您看到的消息已被转换为JSON&转义序列就是这样的结果

理想的方法是调查并防止这种情况发生。我对SNS的了解还不够多,无法给出建议&您指出这是一个非初学者,因此最简单的方法是在收到消息后立即反转此过程

您可以使用JSON库这样做:

var jsonString=string.Format(“\{0}\”,消息);
var xmlString=JsonConvert.DeserializeObject(jsonString);
使用(var reader=newstringreader(xmlString))
{
var profileInformation=(profileInformation)序列化程序。反序列化(读取器);
}

有一些问题可以帮助您取消对字符串的扫描,但我认为我鼓励您调查这是如何发生的以及为什么发生的,并尝试阻止它。您的消息很可能被序列化为JSON,因此如果您无法停止此操作,可以使用JSON库(如Newtonsoft.JSON)来反转此过程(例如,
JsonConvert.DeserializeObject(消息)
)@ CalsMaMar这是一个很好的想法,但恐怕没有骰子。<代码> JSONRealError附加信息:解析值时遇到的意外字符:@ CalsMaGrar我同意在源代码中切断它,但不幸的是,我的API网关直接与SNS集成了——没有LAMBDA或我在中间控制的任何代码。如果需要的话,可以将其与一个lambda集成,该lambda将清理并重新发布到主题。首先用引号将其括起来。请参阅。
<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ProfileInformation>\n\t<Username>bgs264</Username>\n</ProfileInformation>
using (var reader = new StringReader(message))
   var myObj = serializer.Deserialize(reader) as ProfileInformation);