Domanda

Ecco un po 'di codice 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()

Ricevo una stringa simile a:

 <?xml version="1.0" encoding="utf-16"?><hello target="world ' &quot; !" /> 

Sta solo sfuggendo alla virgoletta doppia, non alla virgoletta singola. Ma i documenti per XmlWriter.WriteAttributeString (String, String) dicono:

  

Se il valore dell'attributo include virgolette doppie o singole, lo sono   sostituito con & amp; quot; e & amp; apos; rispettivamente.

C'è qualche bandiera che devo impostare per farlo fare ciò che i documenti dicono che faccia?

È stato utile?

Soluzione

Se usi .Net Reflector per guardare il codice, scoprirai che viene chiamato il metodo System.Xml.XmlTextEncoder.Write (stringa). Ecco il codice di interesse:

if (!this.inAttribute || (this.quoteChar != ch))
   this.textWriter.Write('\'');
else
   this.WriteEntityRefImpl("apos");

Quando si scrive un valore di attributo, non è possibile sfuggire a una singola citazione poiché non è necessario. È solo quando si scrive un elemento di testo che " & amp; apos; " viene utilizzato.

Altri suggerimenti

Questo non è un bug nel XmlWriter , è un bug nel tuo sistema legacy.

Se guardi la definizione di AttValue nella raccomandazione XML 1.0, vedrai che XmlWriter sta facendo esattamente quello che dovrebbe fare: se il il valore dell'attributo è delimitato da apostrofi, un valore dell'attributo può contenere virgolette e se è delimitato da virgolette, un valore dell'attributo può contenere apostrofi.

È possibile, presumibilmente, derivare una classe da XmlTextWriter e sovrascrivere i suoi metodi WriteAttributes e WriteAttributeString . Potrebbe funzionare. Fai attenzione agli spazi dei nomi e alla codifica se lo fai, tuttavia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top