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

単一引用符ではなく、二重引用符をエスケープするだけです。しかし、XmlWriter.WriteAttributeString(String, String) のドキュメントには次のように書かれています。

属性値に二重引用符または一重引用符が含まれている場合、それらは " に置き換えられます。そして' それぞれ。

ドキュメントが言うことを実行するために設定する必要があるフラグはありますか?

4

2 に答える 2

7

.Net Reflectorを使用してコードを確認すると、System.Xml.XmlTextEncoder.Write(string)メソッドが呼び出されていることがわかります。関心のあるコードは次のとおりです。

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

属性値を書き込む場合、一重引用符はエスケープする必要がないため、エスケープされません。「&apos;」というのは、テキスト要素を書くときだけです。使用されている。

于 2009-03-04T19:45:20.933 に答える
2

これは のバグではなく、XmlWriterレガシー システムのバグです。

XML 1.0 勧告の の定義を見ると、 が想定どおりのことを行っているAttValueことがわかります。XmlWriter属性値がアポストロフィで区切られている場合、属性値に引用符を含めることができ、区切られている場合引用符を使用すると、属性値にアポストロフィを含めることができます。

おそらく、からクラスを派生させ、そのメソッドとメソッドXmlTextWriterをオーバーライドすることができます。それはうまくいくかもしれません。ただし、これを行う場合は、名前空間とエンコーディングに注意してください。WriteAttributesWriteAttributeString

于 2009-03-04T20:25:36.657 に答える