C#-标记之间的空格分隔时反序列化
我正在向AWS中的API网关方法发布一些XML,该方法与SNS集成。然后,一个SQS队列被订阅到该主题;我有一个C#进程,它间歇性地轮询队列,需要对XML进行反序列化 问题是,XML标记之间的空白最终会沿着行的某个地方编码,因此选项卡变成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
\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);