質問: (T)xmlSerializer.Deserialize(xmlReader); } ```
回答: リンク先には > > 最初は、`ሴ`のような文字参照は、それが示す文字を空き箱に追加するという意味である。「正規化された値に追加する」とは空き箱に追加する、つまり、文字参照で記述された文字はその文字として扱われ、それ以上何かの処理をされることはない。 **その点で、この後に記述された処理が行われるケースとは明らかに結果が異なる。** 正規化の対象にしたくない文字は、文字参照として書いておくというテクニックがあり得るだろう。 > > > と説明されています(特に最後の一文)。もちろんExtensible Markup Language (XML) 1.0 (Fifth Edition)、3.3.3 Attribute-Value Normalizationにも > > * For a character reference, append the referenced character to the normalized value. > > > とあります。` `が`\r\n`に展開され、に置換されないのは仕様通りの動作では? 実際、 ``` ``` の`attribute`の値は`a b\r\nc`になっていました。 > > 実際に困っている例は`" foo bar "`が`"foo bar"`にならない部分(前後の空白削除と、途中の空白圧縮)です。 > > > これもリンク先に書かれている通りです。 > > 前半は、この規定の発動条件について述べられている。DTDを使わない場合、属性はCDATA型として扱うことが望ましいので、これは主にDTDで属性の型を記述している場合に意味を持つ規定であるといえる。 > > > DTDで属性を`NMTOKENS`と指定すれば仕様通りに正規化されますし、未指定だったり`CDATA`の場合は仕様通り変換されません。なお、DTDを処理するように`XmlReaderSettings.DtdProcessing`.aspx)を`DtdProcessing.Parse`に設定する必要があります。 ``` using System; using System.IO; using System.Xml; using System.Xml.Serialization; public class Test { [XmlAttribute] public string Nmtokens { get; set; } [XmlAttribute] public string Cdata { get; set; } public string Elem { get; set; } public static void Main() { var xml = @" ]> foo bar "; var reader = XmlReader.Create(new StringReader(xml), new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse }); var test = (Test)new XmlSerializer(typeof(Test)).Deserialize(reader); Console.WriteLine("Nmtokens=<{0}>, Cdata=<{1}>, Elem=<{2}>", test.Nmtokens, test.Cdata, test.Elem); // Nmtokens=, Cdata=< foo bar >, Elem=< foo bar > } } ``` 質問文全体に渡って「属性値の中の空白文字が正規化されません」等、変換されることが仕様に沿った動作かのような記述がされていますが、仕様外の**特殊変換**を望んでいることを認識されるべきです。