XmlReaderで属性値が正規化されない問題の回避
.NET FrameworkのSystem.Xml.XmlReader(実体は派生クラス)を使用してXMLデータを読み込むと、属性値の中の空白文字が正規化されません。
属性値の中の空白文字の正規化とは、例えば以下のようなものです。
" foo 
 bar "
⇒"foo bar"
" foo bar "
⇒"foo bar"
参考:
XmlReaderを直接使用して読み込む時は、自分で正規化することができるのですが、XmlSerializerにXmlReaderを渡してデシリアライズする時に正規化する良い方法が思い付きません。
以下の2つの方法以外に、この問題を回避する方法はないでしょうか?
- XmlReaderを直接使用して一旦正規化したXMLデータを作成してから、改めてXmlSerializerでデシリアライズする
→ XMLデータを2回解析するので処理効率が悪く、XmlReaderを使うメリットが半減しそう - XmlReaderの派生クラスを新規作成して、属性値を正規化するValueプロパティを定義する
→ 全ての抽象・仮想メンバーをオーバーライドしてXmlReader.Createで作成したインスタンスに委譲する必要があり、実装が面倒。そもそもこの方法でできるのか、やってみないとわからない
以下ができれば、処理効率、実装効率共に良さそうな対策(イメージです):
using (var xmlReader = XmlReader.Create(streamReader, xmlSettings))
{
// Rubyの特異メソッドのようなことができれば…
public override string xmlReader.Value
{
get {
var value = 委譲先.Value
if (NodeType == XmlNodeType.Attribute)
{
//valueの正規化
}
return value;
}
}
t = (T)xmlSerializer.Deserialize(xmlReader);
}