Как запретить .NET кодировать строку XML с помощью XML.Serialization

Я работаю с некоторой сериализацией 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

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

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

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

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

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

Выход:

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

Выход I НУЖЕН:

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

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

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

Вы хотите сказать, что удаленная веб-служба различает & # xA; и встроенный символ перевода строки? Если это так, я не думаю, что он правильно обрабатывает XML.

David Norman 07.01.2009 01:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
3 816
2

Ответы 2

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

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

+ Том

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

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

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

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

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

Я уже пробовал добавить Environment.NewLine между комментариями, а также Chr (10) между комментариями. Все, что выходит с другой стороны, - это обычный разрыв строки (где мне нужен XML-объект), потому что \ n, Chr (10) являются допустимыми значениями XML, которые не нужно экранировать.

Bryan Rehbein 06.01.2009 23:00

Другие вопросы по теме