我需要将xml属性映射到c#属性。
var src = new Source();
src.Id = 1;
src.Name = "Test";
src.Address = "<Country>MyCountry</Country><Prefecture>MyPrefecture</Prefecture><City>MyCity</City>";
class Source
{
public string ID{ get; set; }
public string Name{ get; set; }
public string Address{ get; set; }
}
Class Destination
{
public string ID{ get; set; }
public string Name{ get; set; }
public string Country { get; set;}
public string Prefecture { get; set;}
public string City { get; set;}
}
是否可以通过AutoMapper实现它?
答案 0 :(得分:0)
您可以执行以下操作。考虑您的来源类型。
var src = new Source();
src.ID = 1;
src.Name = "Test";
src.Address = "<Country>MyCountry</Country><Prefecture>MyPrefecture</Prefecture><City>MyCity</City>";
由于您的源类型(src.Address)没有根元素,因此我们添加一个根元素并将xml解析为XDocument。
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse($"<Root>{src.Address}</Root>");
现在,在自动映射器初始化期间,您需要映射字段。
Mapper.Initialize(cfg =>
cfg.CreateMap<XElement, Destination>()
.ForMember(dest => dest.Country, opt => opt.MapFrom(x=>x.Element(nameof(Destination.Country)).Value))
.ForMember(dest => dest.City, opt => opt.MapFrom(x => x.Element(nameof(Destination.City)).Value))
.ForMember(dest => dest.Prefecture, opt => opt.MapFrom(x => x.Element(nameof(Destination.Prefecture)).Value)));
现在您可以按照以下步骤解决它。
Destination result = Mapper.Map<XElement, Destination>(xdoc.Root);
更新
您也可以为此目的使用ConstructUsing,这会将Xml相关的代码与其他代码隐藏起来。
var src = new Source();
src.ID = "1";
src.Name = "Test";
src.Address = "<Country>MyCountry</Country><Prefecture>MyPrefecture</Prefecture><City>MyCity</City>";
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse($"<Root>{src.Address}</Root>");
Mapper.Initialize(cfg =>
cfg.CreateMap<Source, Destination>()
.ConstructUsing(x=>ConstructDestination(x))
);
ConstructDestination 定义为
的位置static Destination ConstructDestination(Source src)
{
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse($"<Root>{src.Address}</Root>");
return new Destination
{
Country = xdoc.Root.Element(nameof(Destination.Country)).Value,
City = xdoc.Root.Element(nameof(Destination.City)).Value,
Prefecture = xdoc.Root.Element(nameof(Destination.Prefecture)).Value,
};
}
您的客户端代码现在看起来更干净了。
Destination result = Mapper.Map<Source, Destination>(src);
答案 1 :(得分:0)
一种选择是将其与根节点包装并使用可序列化的类。
该类如下:
<version>${revision}</version>
反序列化如下所示:
[Serializable]
public class Address
{
public string Country { get; set; }
public string Prefecture { get; set; }
public string City { get; set; }
}