C # - десериализация, когда пробелы между тегами разграничены - PullRequest
0 голосов
/ 14 февраля 2019

Я отправляю XML в метод API-шлюза в AWS, который интегрирован в 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 и т. Д.

Однако это не«строки выглядят как таковые в отладчике, но на самом деле это вкладка», они на самом деле похожи на в строке.

Поэтому, когда я пытаюсь десериализовать, используя

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, поэтому при замене я ошибочно получу, например, bgs\264.

Так что мне нужно исправить эти \n\t символы там, где онивстречаются между тегами XML.

Для чего бы то ни было, у меня также есть лямбда, написанная на Go, которая не имеет проблем с этим и просто десериализует точно такую ​​же строку прямо в XML.Так что это должно быть возможно.

Мои первоначальные мысли:

  • Можно ли как-то декодировать строку перед передачей для десериализации?Я попробовал это с HttpUtility.DecodeHtml, но я не думаю, что это на самом деле HTML, который я пытаюсь декодировать!
  • Можно ли использовать другую библиотеку XML, которая бы работала?

1 Ответ

0 голосов
/ 15 февраля 2019

Я бы предположил, и некоторые поиски в Google, кажется, подтверждают теорию, что сообщение, которое вы видите, было преобразовано в JSON, и как следствие этого есть escape-последовательности.

Идеальным подходом было бы расследовать и предотвратить это.Я не знаю достаточно о SNS, чтобы посоветовать, и вы указываете, что это не стартер, поэтому самый простой подход - это отменить этот процесс после получения сообщения.

Вы можете использовать библиотеку JSON, например Json.NET для этого:

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

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

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