Преобразование XML-документа в строку запроса в кодировке URL для HTTP POST - C # - PullRequest
1 голос
/ 05 ноября 2010

Я отправляю сообщение на веб-страницу, где мне сказали, что XML - это тело. Оказывается, что на самом деле требуется то, что выглядит как строка запроса CGI в кодировке URL:

<FIRST>
  <ELEMENT1>Value1</ELEMENT1>
  <ELEMENT2>Value1</ELEMENT2>
  <ELEMENT3>Value1</ELEMENT3>
</FIRST>

<SECOND>
  <ELEMENT1>Value1</ELEMENT1>
  <ELEMENT2>Value1</ELEMENT2>
</SECOND>

Необходимо передать как

FIRST_ELEMENT1 = VALUE1 & FIRST_ELEMENT2 = VALUE2 & FIRST_ELEMENT3 = VALUE3 & SECOND_ELEMENT1 = VALUE1 & SECOND_ELEMENT2 = VALUE2

Третья сторона говорит мне, что это обычное использование, хотя я раньше не видел его (как способ отправки XML), очевидно, что сервис был разработан для приема HTML POST с формой в качестве источника данных. .

Хотя я вижу, как написать преобразование, мне интересно, есть ли в фреймворке .Net метод, обеспечивающий этот перевод. До и включая .Net 3.5 доступен для этого проекта.

Спасибо заранее Dave

Ответы [ 3 ]

3 голосов
/ 05 ноября 2010

Я никогда не видел такого использования, но что-то вроде:

var query = string.Join("&",(
            from parent in XElement.Parse(xml).Elements()
            from child in parent.Elements()
            select HttpUtility.UrlEncode(parent.Name.LocalName) + "_"
                 + HttpUtility.UrlEncode(child.Name.LocalName) + "="
                 + HttpUtility.UrlEncode(child.Value)).ToArray());
1 голос
/ 05 ноября 2010

Я сильно сомневаюсь, что для этого есть что-то встроенное, но его кодирование не должно быть сложным.Я бы использовал рекурсивный метод, который проверяет дочерние элементы узла, вызывая себя со строковым префиксом, который представляет положение узла в дереве.Сохраняйте List или Dictionary или что-то еще, что лучше всего соответствует вашим потребностям вне метода, и когда вы встречаете узел с текстовыми данными, добавьте тег prefix + и значение в ваш список.Тогда будет тривиально просмотреть этот список и объединить их в формате строки запроса.Будьте осторожны, чтобы избежать амперсандов и других зарезервированных символов.

0 голосов
/ 06 ноября 2010

Это кажется довольно сумасшедшим, я надеюсь, что ваши XML-данные не очень длинные ... у вас могут возникнуть проблемы, если строка запроса заканчивается слишком долго.

Я не понимаю, почему выне может выполнить HTTP-POST, установите для типа содержимого значение 'text / xml' и просто отправьте необработанные данные XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...