Я искал универсальный метод в .Net для кодирования строки для использования в элементе или атрибуте Xml и был удивлен, когда я не нашел его сразу. Итак, прежде чем я пойду слишком много дальше, могу ли я просто пропустить встроенную функцию?
Предполагая на мгновение, что это действительно не существует, я собираю свой собственный общий метод EncodeForXml(string data)
, и я думаю о том, как это сделать.
Данные, которые я использую, которые вызвали все это, могут содержать плохие символы, такие как &, <, ", и т.д. Он также может иногда содержать правильно экранированные объекты: &, & lt;, и", что означает, что просто использование секции CDATA может быть не лучшей идеей. Это похоже на klunky anyay; Я бы скорее получил хорошее строковое значение, которое можно использовать непосредственно в xml.
Я использовал регулярное выражение в прошлом, чтобы просто ловить плохие амперсанды, и я думаю использовать его, чтобы поймать их в этом случае, а также первый шаг, а затем сделать простую замену для других символов.
Итак, может ли это быть оптимизировано дальше, не делая его слишком сложным, и есть ли что-нибудь, чего я не вижу?
Function EncodeForXml(ByVal data As String) As String
Static badAmpersand As new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)")
data = badAmpersand.Replace(data, "&")
return data.Replace("<", "<").Replace("""", """).Replace(">", "gt;")
End Function
Извините за все, что вы С# - только люди - мне все равно, какой язык я использую, но я хочу сделать статическое Regex, и вы не можете сделать это на С#, не объявляя его вне метода, поэтому это будет VB.Net
Наконец, мы все еще работаем на .Net 2.0, но если кто-то может взять конечный продукт и превратить его в метод расширения для класса строк, это тоже будет круто.
Обновление. Первые несколько ответов показывают, что .Net действительно имеет встроенные способы сделать это. Но теперь, когда я начал, я как бы хочу закончить свой метод EncodeForXml() только ради удовольствия, поэтому я все еще ищу идеи для улучшения. Примечательно: более полный список символов, которые должны быть закодированы как сущности (возможно, сохранены в списке/карте) и что-то, что имеет лучшую производительность, чем выполнение .Replace() в неизменяемых строках в последовательном интерфейсе.