文字列型フィールド内に XML データのブロックを格納するデータベース テーブルがあります。その XML の特定の要素をカスタム ViewModel に抽出したいと考えています。
この例では、ErrorTableModel.ErrorXML がサンプルの XML 文字列を保持しています。その文字列から「メッセージ」要素を取得して、ErrorViewModel.message にマップしようとしています。
AutoMapper を使用してこれを達成することは可能でしょうか?
サンプル文字列。このデータは、ErrorTableModel の ErrorXML プロパティに格納されます。
<error
application="TestApp"
type="System.DivideByZeroException"
message="Something wicked this way comes."
</error>
データベース モデル:
public class ErrorTableModel
{
public int ErrorId { get; set; }
public string ErrorXml { get; set; }
}
カスタム ビューモデル:
public class ErrorViewModel
{
public int id { get; set; }
public string application { get; set; }
public string type { get; set; }
public string message { get; set; }
}
更新: XML の分割を支援するための新しいヘルパー クラスを作成しました。
protected override T ResolveCore(XElement source)
{
if (source == null || string.IsNullOrEmpty(source.Value))
{
return default(T);
}
return (T)Convert.ChangeType(source.Value, typeof(T));
}
ErrorViewModel からマッピングを実行するときに、そのメソッドを参照しようとしています。
Mapper.CreateMap<XElement, ErrorViewModel>()
.ForMember(
dest => dest.ErrorXml,
options => options.ResolveUsing<XElementResolver<string>>()
.FromMember(source => source.Element("error")
.Descendants("message").Single()));
悲しいことに、これは機能しません...しかし、私は近いと思います。
更新 2:
明確にするために、結果のデータを次のようにしたいと思います。
ErrorViewModel.application = "TestApp"
ErrorViewModel.type = "System.DivideByZeroException"
ErrorViewModel.message = "Something wicked this way comes."