質問

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

これは、シングルクォートではなく、ダブルクォートをエスケープするだけです。しかし、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 メソッドをオーバーライドできます。それはうまくいくかもしれません。ただし、これを行う場合は、名前空間とエンコードに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top