Eché un vistazo a string escape into XML y me pareció muy útil.cadena de escape en XML-Attribute
Me gustaría hacer algo similar: escapar de una cadena que se utilizará en un atributo XML.
La cadena puede contener \ r \ n. La clase XmlWriter produce algo así como \ r \ n -> & #xD; & #xA;
La solución que estoy usando actualmente incluye el XmlWriter y un StringBuilder y es bastante fea.
¿Alguna pista?
Edit1:
siento decepcionar Larsh, comprar mi primer acercamiento fue
public static string XmlEscapeAttribute(string unescaped)
{
XmlDocument doc = new XmlDocument();
XmlAttribute attr= doc.CreateAttribute("attr");
attr.InnerText = unescaped;
return attr.InnerXml;
}
No funciona. XmlEscapeAttribute("Foo\r\nBar")
dará como resultado "Foo\r\nBar"
Utilicé el reflector .NET, para descubrir cómo el XmlTextWriter escapa de los atributos. Se utiliza la clase XmlTextEncoder que es interno ...
Mi método lokks estoy actualmente USIG así:
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();
}
Es feo y probablemente lento, pero funciona: XmlEscapeAttribute("Foo\r\nBar")
dará lugar a "Foo
Bar"
Edit2:
SecurityElement.Escape(unescaped);
no funciona bien.
Edit3 (final):
Utilizando todos los comentarios muy útiles de Lars, mi implementación final es el siguiente:
Nota: la .Replace("\r", "
").Replace("\n", "
");
no es necesaria para XML válido. ¡Es una medida cosmética solamente!
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", "
");
}
Como resulta que esto es XML válido y será analizado por cualquier estándar compatible con XML parser:
<response message="Thank you,
LarsH!" />
Podría modificar la técnica en la respuesta se ha vinculado a arriba, de manera que se crea un nodo de atributo, mete la cadena en innerText del nodo, y extrae su InnerXml? ¿Qué sucede si simplemente cambias CreateElement() a CreateAttribute()? – LarsH
También debe asegurarse de evitar comillas dobles. –