XmlWriter solo se escapa de un tipo de cita
Pregunta
Aquí hay un código C #:
var sb = new StringBuilder();
var w = XmlWriter.Create(sb);
w.WriteStartElement("hello");
w.WriteAttributeString("target", "world ' \" !");
w.WriteEndElement();
w.Flush();
// then look at sb.ToString()
Me aparece una cadena que se parece a:
<?xml version="1.0" encoding="utf-16"?><hello target="world ' " !" />
Solo se está escapando la comilla doble, no la comilla simple. Pero los documentos para XmlWriter.WriteAttributeString (String, String) dicen:
Si el valor del atributo incluye comillas dobles o simples, son reemplazado con & amp; quot; y & amp; apos; respectivamente.
¿Debo establecer algún indicador para que haga lo que dicen los documentos?
Solución
Si usa .Net Reflector para ver el código, encontrará que se está llamando al método System.Xml.XmlTextEncoder.Write (cadena). Aquí está el código de interés:
if (!this.inAttribute || (this.quoteChar != ch))
this.textWriter.Write('\'');
else
this.WriteEntityRefImpl("apos");
Al escribir un valor de atributo, no se escapa una sola cita, ya que no es necesario. Solo cuando se escribe un elemento de texto " & amp; apos; " se utiliza.
Otros consejos
Esto no es un error en el XmlWriter
, es un error en su sistema heredado.
Si observa la definición de AttValue
en la recomendación XML 1.0, verá que XmlWriter
está haciendo exactamente lo que se supone que debe hacer: si el el valor del atributo se delimita con apóstrofes, un valor de atributo puede contener comillas, y si se delimita con comillas, el valor de un atributo puede contener apóstrofes.
Podría, posiblemente, derivar una clase de XmlTextWriter
y anular sus métodos WriteAttributes
y WriteAttributeString
. Aquello podría funcionar. Sin embargo, tenga cuidado con los espacios de nombres y la codificación si hace esto.