Как остановить .NET от кодирования строки XML с XML.Serialization - PullRequest
3 голосов
/ 06 января 2009

Я работаю с некоторой сериализацией Xml в ASP.NET 2.0 в веб-сервисе. Проблема в том, что у меня есть элемент, который определен, как это:

<System.Xml.Serialization.XmlElementAttribute(Form:=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable:=True)> _
Public Property COMMENTFIELD() As String
    Get
        Return CommentField ' This is a string
    End Get
    Set(ByVal value as String)
        CommentField = value
    End Set
End Property

В другом месте кода я создаю комментарий и добавляю & # xA; как разрыв строки (в соответствии с правилами веб-службы, которую мы отправляем) между каждым «комментарием», например, так: (Помните, что & # xA; является действительным объектом XML, представляющим символ 10 (перевод строки I верить).

XmlObject.COMMENTFIELD = sComment1 & "&#xA;" & sComment2

Проблема в том, что .NET пытается оказать нам услугу и кодирует & в строке комментария, которая в итоге отправляет целевую веб-службу так: &amp;#xA;, что, очевидно, не то, что мы хотим.

Вот что сейчас происходит:

XmlObject.COMMENTFIELD = sComment1 & "&#xA;" & sComment2

Выход:

<COMMENTFIELD>comment1 &amp;#xA comment2</COMMENTFIELD>

Вывод мне НУЖЕН:

<COMMENTFIELD>comment1 &#xA; comment2</COMMENTFIELD>

Вопрос в следующем: Как заставить среду выполнения .NET не пытаться и не оказывать мне никаких услуг в отношении кодирования данных, которые, как я уже знаю, совместимы с XML и уже экранированы (кстати, sComment1 и sComment2 уже сбежать). Я привык заботиться о своем XML, не зависимо от чего-то волшебного, что происходит от всех моих данных за моей спиной!

Мне нужно иметь возможность передавать действительный XML в свойство COMMENTFIELD без кодирования .NET данных, которые я ему даю (так как это уже XML). Мне нужно знать, как сообщить .NET, что получаемые данные являются строкой XML, а не обычной строкой, которую необходимо экранировать.

Ответы [ 2 ]

2 голосов
/ 06 января 2009

Если вы посмотрите на раздел XML spec , раздел 2.4, вы увидите, что символ & в тексте элемента всегда использовался для обозначения чего-то экранированного, поэтому, если вы хотите отправить символ &, его необходимо например, & &. .Net конвертирует переданную вами литеральную строку в действительный XML.

Если вы действительно хотите, чтобы веб-сервис получал буквальный текст &, тогда .NET делает правильные вещи. Когда веб-сервис обрабатывает XML, он преобразует его обратно в ту же строку, которую вы указали на своем конце.

С другой стороны, если вы хотите отправить в удаленный веб-сервис строку с новой строкой, вам просто нужно создать строку с новой строкой:

XmlObject.COMMENTFIELD = sComment1 & "\ n" & sComment2

.Net сделает все правильно, чтобы убедиться, что это правильно передается по проводам.

0 голосов
/ 06 января 2009

Вероятно, опасно смешивать два разных соглашения о кодировании в одной строке. Поскольку у вас есть собственное соглашение, я рекомендую явно кодировать всю строку, когда она готова к отправке, и явно декодировать ее на принимающей стороне.

Попробуйте метод HttpServerUtility.HtmlEncode (System.Web).

+ * Том 1007 *

...