Я работаю с некоторой сериализацией 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 & "
" & sComment2
Проблема в том, что .NET пытается оказать нам услугу и закодировать & в строке комментария, что в конечном итоге отправляет целевой веб-службе следующее: &#xA;, что, очевидно, не то, что мы хотим.
Вот что сейчас происходит:
XmlObject.COMMENTFIELD = sComment1 & "
" & sComment2
Выход:
<COMMENTFIELD>comment1 &#xA comment2</COMMENTFIELD>
Выход I НУЖЕН:
<COMMENTFIELD>comment1 
 comment2</COMMENTFIELD>
Вопрос в том: Как мне заставить среду выполнения .NET не пытаться сделать мне какие-либо одолжения в отношении кодирования данных, которые, как я уже знаю, совместимы с XML и уже экранированы (кстати, sComment1 и sComment2 уже были экранированы). Я привык заботиться о своем XML, независимо от того, что-то волшебное, что случается, ускользает от всех моих данных за моей спиной!
Мне нужно иметь возможность передавать действительный XML в свойство COMMENTFIELD без кодирования .NET данных, которые я ему передаю (поскольку это уже XML). Мне нужно знать, как сообщить .NET, что данные, которые он получает, представляют собой строку XML, а не обычную строку, которая требует экранирования.





Вероятно, опасно смешивать два разных соглашения о кодировании в одной строке. Поскольку у вас есть собственное соглашение, я рекомендую явно кодировать всю строку, когда она готова к отправке, и явно декодировать ее на принимающей стороне.
Попробуйте метод 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, которые не нужно экранировать.
Вы хотите сказать, что удаленная веб-служба различает & # xA; и встроенный символ перевода строки? Если это так, я не думаю, что он правильно обрабатывает XML.