XmlWriter n'échappant qu'à un seul type de devis
Question
Voici un code 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()
Je reçois une chaîne qui ressemble à:
<?xml version="1.0" encoding="utf-16"?><hello target="world ' " !" />
Cela échappe seulement à la citation double, pas à la citation simple. Mais la documentation de XmlWriter.WriteAttributeString (String, String) dit:
Si la valeur de l'attribut comprend des guillemets simples ou doubles, ils sont remplacé par & amp; quot; et & apos; respectivement.
Existe-t-il un indicateur à configurer pour que le document soit conforme à la documentation?
La solution
Si vous utilisez. Net Reflector pour consulter le code, vous constaterez que la méthode System.Xml.XmlTextEncoder.Write (string) est appelée. Voici le code d'intérêt:
if (!this.inAttribute || (this.quoteChar != ch))
this.textWriter.Write('\'');
else
this.WriteEntityRefImpl("apos");
Lors de l'écriture d'une valeur d'attribut, un guillemet simple n'est pas échappé puisqu'il n'est pas nécessaire de l'être. C’est uniquement lors de l’écriture d’un élément de texte que & & amp; apos; " est utilisé.
Autres conseils
Ce n'est pas un bogue dans XmlWriter
, c'est un bogue dans votre système hérité.
Si vous regardez la définition de AttValue
dans la recommandation XML 1.0, vous verrez que le XmlWriter
fait exactement ce qu'il est censé faire: si le La valeur d'attribut est délimitée par des apostrophes. Une valeur d'attribut peut contenir des guillemets. Si elle est délimitée par des guillemets, une valeur d'attribut peut contenir des apostrophes.
Vous pourriez éventuellement dériver une classe de XmlTextWriter
et remplacer ses méthodes WriteAttributes
et WriteAttributeString
. Cela pourrait fonctionner. Attention toutefois aux espaces de noms et à l'encodage.