Есть ли XmlEncode / XmlDecode для .NET? - PullRequest
11 голосов
/ 08 апреля 2010

Существуют ли методы для кодирования и декодирования XML в .NET? Кажется, я не могу их найти, и мне интересно, почему их там нет и что вместо этого использовать?

Мне нужно закодировать XML-документ и передать его в строковый параметр веб-службы. Затем он должен быть декодирован на другом конце.

Ответы [ 4 ]

8 голосов
/ 08 апреля 2010

На самом деле с хорошими объектами в System.Xml.Linq вам не нужно беспокоиться.

Я имею в виду, что при запуске этого кода вы не получите исключение времени выполнения.

var element = new XElement("Name", "<Node />");

Значением элемента будет текстовый узел с &lt;Node /&gt;.

1 голос
/ 08 апреля 2010

Если вы передаете XML как строковый параметр (очень плохой дизайн веб-службы, кстати), вам не нужно ничего делать.Веб-сервис должен выполнить любую кодировку, которая может потребоваться.Просто используйте XDocument.ToString() или что-то еще и передайте результат веб-службе.

1 голос
/ 08 апреля 2010

Если вы имеете в виду кодирование / декодирование имен XML, существует XmlConvert.EncodeName и DecodeName .

Или вы говорите об указании кодировки / декодирования всего XML-документа с использованием XmlDeclaration или XDeclaration ? (Я думал, что это позаботилось о кодировании для нас)

0 голосов
/ 09 июня 2011

Это не правда!

Var element As XElement = <Name><%= GetValue() %></Name>

Private Function GetValue() As String
  Return "Value with < and > as well as a " & Chr(0) & " (Nul)"
End Function

работает со знаками меньшего и большего размера, но не со специальными символами, такими как NUL или другие символы с низким ASCII (при сбое не происходит сбой при добавлении строки, а при вызове ToString () или ее записи где-либо).

Если читаемость не так важна, используйте этот метод:

Public Function ToXmlString(ByVal aString As String) As String
    If (aString Is Nothing) Then Return ""
    Dim myResult As New StringBuilder(aString.Length + 10)
    For Each myChar As Char In aString
        If ("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ.:,;!?-_$£{}()[]+*/\0123456789".IndexOf(myChar) > -1) Then
            myResult.Append(myChar)
        Else
            Select Case myChar
                Case "&"c
                    myResult.Append("&amp;")
                Case """"c
                    myResult.Append("&quot;")
                Case "<"c
                    myResult.Append("&lt;")
                Case ">"c
                    myResult.Append("&gt;")
                Case Else
                    myResult.Append("&#")
                    myResult.Append(AscW(myChar))
                    myResult.Append(";"c)
            End Select
        End If
    Next
    Return myResult.ToString()
End Function

для экранирования значений перед их назначением.

Если важна читабельность, реализуйте все константы из http://de.selfhtml.org/html/referenz/zeichen.htm.

...