Я искал универсальный метод в .Net для кодирования строки для использования в элементе или атрибуте Xml, и был удивлен, когда не сразу нашел его. Итак, прежде чем я зайду слишком далеко, могу ли я просто пропустить встроенную функцию?
Предполагая на мгновение, что его на самом деле не существует, я собираю свой собственный общий EncodeForXml(string data)
метод и думаю, как лучше всего это сделать.
Данные, которые я использую, которые запрашивали все это, могли содержать недопустимые символы, такие как &, <, "и т. Д. Иногда они могли также содержать правильно экранированные сущности: & amp ;, & lt; и & quot ;, что означает просто использование раздела CDATA может быть не самой лучшей идеей. В любом случае, это кажется немного хитрым, я бы предпочел получить хорошее строковое значение, которое можно использовать непосредственно в xml. </p>
В прошлом я использовал регулярное выражение, чтобы просто ловить плохие амперсанды, и я думаю использовать его, чтобы поймать их в этом случае, а также в качестве первого шага, а затем выполнить простую замену для других символов.
Итак, можно ли оптимизировать это дальше, не делая его слишком сложным, и я что-то упускаю? :
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
Извините за всех вас, C # -только людей - мне действительно все равно, какой язык я использую, но я хотел сделать Regex статическим, и вы не можете сделать это в C #, не объявив его вне метода так что это будет VB.Net
Наконец, мы все еще на .Net 2.0, где я работаю, но если бы кто-то мог взять конечный продукт и превратить его в метод расширения для строкового класса, это тоже было бы здорово.
Обновление Первые несколько ответов показывают, что .Net действительно имеет встроенные способы сделать это. Но теперь, когда я начал, я хочу закончить свой метод EncodeForXml () просто для удовольствия, поэтому я все еще ищу идеи для улучшения. В частности: более полный список символов, которые должны быть закодированы как сущности (возможно, сохранены в списке / карте), и что-то, что дает лучшую производительность, чем выполнение .Replace () для неизменяемых строк в последовательном соединении.