2009-03-04 9 views
1

est ici un code C#:XmlWriter ne s'échapper une sorte de citation

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

Il est seulement échapper à la guillemet, pas le seul -citation. Mais les docs pour XmlWriter.WriteAttributeString (String, String) disent:

Si la valeur d'attribut comprend des guillemets doubles ou simples, ils sont remplacés par & quot; et & apos; respectivement.

Y a-t-il un drapeau que je dois définir pour qu'il fasse ce que disent les docs?

+0

Comme ils sont sémantiquement identiques, pouvez-vous expliquer pourquoi cela vous cause des problèmes? –

+0

Compatibilité avec les systèmes hérités, malheureusement. Certes, cela ne poserait pas de problème si XmlWriter et .NET ne semblaient pas avoir de bogues superposés. : P – Ken

+0

Ainsi, le système hérité ne peut pas comprendre XML valide. Ick. –

Répondre

7

Si vous utilisez .Net Reflector pour examiner le code, vous constaterez que la méthode System.Xml.XmlTextEncoder.Write (chaîne) 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, une seule citation est pas échappé car il n'a pas besoin d'être. Ce n'est que lors de l'écriture d'un élément de texte que "& apos;" est utilisé.

2

Ce n'est pas un bogue dans le XmlWriter, c'est un bug dans votre ancien système. 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 la valeur d'attribut est délimitée par des apostrophes, une valeur d'attribut peut contenir une citation marques, et si elle est délimitée par des guillemets, une valeur d'attribut peut contenir des apostrophes.

Vous pourriez, en théorie, dériver une classe de XmlTextWriter et remplacer ses méthodes WriteAttributes et WriteAttributeString. Cela pourrait fonctionner. Méfiez-vous des espaces de noms et de l'encodage si vous faites cela, cependant.

+0

Quand les docs officiels disent qu'une méthode devrait faire quelque chose, et ce n'est pas le cas, j'appelle ça un bug. YMMV. :-) – Ken

+0

Bien sûr, mais c'est un bug dans les docs. Ils essaient d'être trop utiles. Ce que les docs * doivent * noter sont des comportements spécifiques à l'implémentation, par ex. le fait que la méthode s'échappe> même si la recommandation XML ne l'exige pas. –

Questions connexes