XmlWriter sfugge a un solo tipo di preventivo
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 ' " !" />
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?
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.