XMLWriter apenas escapando de um tipo de citação
Pergunta
Aqui está algum 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()
Estou recebendo uma corda que parece:
<?xml version="1.0" encoding="utf-16"?><hello target="world ' " !" />
Está apenas escapando da quadra dupla, não da única citação. Mas os documentos para xmlwriter.writeattributestring (string, string) dizem:
Se o valor do atributo incluir cotações duplas ou únicas, elas serão substituídas por "e 'respectivamente.
Existe alguma bandeira que eu preciso definir para fazer o que os documentos dizem que faz?
Solução
Se você usar o .NET Reflector para olhar para o código, você descobrirá que o método System.xml.xmltextExoder.Write (String) está sendo chamado. Aqui está o código de interesse:
if (!this.inAttribute || (this.quoteChar != ch))
this.textWriter.Write('\'');
else
this.WriteEntityRefImpl("apos");
Ao escrever um valor de atributo, uma única cotação não é escapada, pois não precisa ser. É apenas quando escreve um elemento de texto que "" é usado.
Outras dicas
Este não é um bug no XmlWriter
, é um bug no seu sistema legado.
Se você olhar para a definição de AttValue
Na recomendação XML 1.0, você verá que o XmlWriter
está fazendo exatamente o que deveria estar fazendo: se o valor do atributo for delimitado com apóstrofos, um valor de atributo pode conter as cotações e se for delimitado com aspas, um valor de atributo pode conter apóstrofos.
Você poderia, concebivelmente, derivar uma classe de XmlTextWriter
e substituir seu WriteAttributes
e WriteAttributeString
métodos. Isso pode funcionar. Cuidado com os namespaces e a codificação, se você fizer isso, no entanto.