Я посмотрел на выход строки в XML и нашел его очень полезным.
Я хотел бы сделать аналогичную вещь: экранировать строку для использования в XML-атрибуте.
Строка может содержать \ r \ n.
Класс XmlWriter создает что-то вроде \ r \ n -> & # xD; & # xA;
Решение, которое я сейчас использую, включает в себя XmlWriter и StringBuilder и довольно уродливо.
Есть намеки?
Edit1:
Извините, что разочаровал LarsH, купить мой первый подход был
public static string XmlEscapeAttribute(string unescaped)
{
XmlDocument doc = new XmlDocument();
XmlAttribute attr= doc.CreateAttribute("attr");
attr.InnerText = unescaped;
return attr.InnerXml;
}
Это не работает. XmlEscapeAttribute("Foo\r\nBar")
приведет к "Foo\r\nBar"
Я использовал .NET Reflector, чтобы узнать, как XmlTextWriter экранирует атрибуты. Он использует класс XmlTextEncoder, который является внутренним ...
Мой метод, которым я сейчас пользуюсь, выглядит следующим образом:
public static string XmlEscapeAttribute(string unescaped)
{
if (String.IsNullOrEmpty(unescaped)) return unescaped;
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb, settings);
writer.WriteStartElement("a");
writer.WriteAttributeString("a", unescaped);
writer.WriteEndElement();
writer.Flush();
sb.Length -= "\" />".Length;
sb.Remove(0, "<a a=\"".Length);
return sb.ToString();
}
Это некрасиво и, вероятно, медленно, но работает: XmlEscapeAttribute("Foo\r\nBar")
приведет к "Foo
Bar"
Edit2:
SecurityElement.Escape(unescaped);
тоже не работает.
Edit3 (окончательный вариант):
Используя все очень полезные комментарии от Lars, моя окончательная реализация выглядит так:
Примечание : .Replace("\r", "
").Replace("\n", "
");
не требуется для действительного XMl. Это только косметическая мера!
public static string XmlEscapeAttribute(string unescaped)
{
XmlDocument doc = new XmlDocument();
XmlAttribute attr= doc.CreateAttribute("attr");
attr.InnerText = unescaped;
// The Replace is *not* required!
return attr.InnerXml.Replace("\r", "
").Replace("\n", "
");
}
Как выясняется, это допустимый XML и будет проанализирован любым стандартным XMl-анализатором:
<response message="Thank you,
LarsH!" />