XmlWriterは1種類の引用のみをエスケープします
質問
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()
次のような文字列を取得しています:
<?xml version="1.0" encoding="utf-16"?><hello target="world ' " !" />
これは、シングルクォートではなく、ダブルクォートをエスケープするだけです。しかし、XmlWriter.WriteAttributeString(String、String)のドキュメントには次のように書かれています。
属性値に二重引用符または単一引用符が含まれる場合、それらは &amp; quot;に置き換えられましたおよび&amp; apos;それぞれ。
ドキュメントに記載されていることを実行するために設定する必要があるフラグはありますか?
解決
.Net Reflectorを使用してコードを見ると、System.Xml.XmlTextEncoder.Write(string)メソッドが呼び出されていることがわかります。関心のあるコードは次のとおりです。
if (!this.inAttribute || (this.quoteChar != ch))
this.textWriter.Write('\'');
else
this.WriteEntityRefImpl("apos");
属性値を書き込むとき、一重引用符はエスケープする必要がないため、エスケープされません。 「&amp; apos;」というテキスト要素を書くときだけです。使用されます。
他のヒント
これは XmlWriter
のバグではなく、レガシーシステムのバグです。
XML 1.0勧告の AttValue
の定義を見ると、 XmlWriter
が本来の動作を正確に実行していることがわかります。属性値はアポストロフィで区切られ、属性値には引用符を含めることができます。引用符で区切られている場合、属性値にはアポストロフィを含めることができます。
おそらく、 XmlTextWriter
からクラスを派生させ、その WriteAttributes
および WriteAttributeString
メソッドをオーバーライドできます。それはうまくいくかもしれません。ただし、これを行う場合は、名前空間とエンコードに注意してください。