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 ' &quot; !" /> 

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top