以下是mapper的代码:
public IEnumerable<GetQuestionsContract> Map(IEnumerable<XmlNode> nodes, XmlNamespaceManager namespaceManager)
{
Mapper.CreateMap<XmlNode, GetQuestionsContract>()
.ForMember(
dest => dest.Id,
options =>
options.ResolveUsing<XmlNodeResolver<string>>().FromMember(
source => source.SelectSingleNode("//wfauth60xsd:questionID", namespaceManager)))
.ForMember(
dest => dest.Question,
options =>
options.ResolveUsing<XmlNodeResolver<string>>().FromMember(
source => source.SelectSingleNode("//wfauth60xsd:question", namespaceManager)));
return Mapper.Map<IEnumerable<XmlNode>, List<GetQuestionsContract>>(nodes);
}
虽然这有效,但它似乎只能多次返回IEnumerable列表中的第一个元素(与XmlNodeList中的项目一样多次)。
更新:我简化了代码并更新了标题。如果我映射到一个XmlNode,该方案可以正常工作,但枚举似乎是个问题。例如,以下代码可以正常工作:
public SomeIdContract Map(XmlDocument document, XmlNamespaceManager namespaceManager)
{
Mapper.CreateMap<XmlDocument, SomeIdContract>()
.ForMember(
dest => dest.Id,
options =>
options.ResolveUsing<XmlNodeResolver<string>>().FromMember(
source => source.SelectSingleNode("//wfauth60msgs:someID", namespaceManager)));
return Mapper.Map<XmlDocument, SomeIdContract>(document);
}
有什么想法?谢谢!
答案 0 :(得分:3)
我遇到了完全相同的问题。结果发现AutoMapper在缓存源时使用我的模型对象的Id(Guid)属性(通常由nhiberate私有设置)作为标识符(无论其他属性有何不同)。在测试期间,我从不设置id,因此所有对象的默认guid都是相同的,这解释了为什么只返回IEnumerable中的第一个项目。因此,我必须将Id公开给我的测试,为每个项目设置Id,然后一切正常。
答案 1 :(得分:1)
似乎问题不在于AutoMapper,而是由于某些疯狂的原因XPath选择了第一个节点。
将XmlDocument转换为XDocument并使用Linq-to-Xml解决了我的问题。
感谢您的投入。