将xml中的节点与Entity框架类匹配
本文关键字:框架 Entity xml 节点 | 更新日期: 2023-09-27 18:27:11
我有一个sql server DB,里面有很多表。在一个名为orders
的表中,我有大约20个不同类型的字段。每天晚上,我都会得到这个xml文件,我支持它进行解析并插入到表中。问题是order
节点的xml片段始终是该表中列数的子集。在一个节点中,我可以有4个字段。然而,在另一个节点(相同的xml文件)中,我可以使用9个字段。但是,xmlorder
节点始终是我在orders
表中拥有的列的子集。
现在,理论上我可以对所有20个字段进行布局,并将它们逐一匹配到xml文件,无论我是否具有该元素。如果我不这样做,我可以把这个该死的东西包装在try/catch
中,如果元素不存在,我可以在catch块中将它设置为null
。但那是90年代的事了。有dynamic
的方法吗?
如果XML结构反映(理论上如果完整)表模式,则可以使用Linq2Sql导入表模式,该Linq2Sql创建一个用于表示表的类。
因此,您可以创建一个数据上下文来连接到数据库,并直接在表条目实体上反序列化XML。如果XML不符合使用直接反序列化的正确名称,您可以使用regex和字符串替换来操作它。如果中缺少字段,则在反序列化过程中将被忽略(在实体中保持为null)。
public static XElement XmlSerialize(object obj, bool returnNullOnError = false)
{
try
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
StringWriter stream = new StringWriter();
serializer.Serialize(stream, obj);
XDocument xml = XDocument.Parse(stream.ToString());
return xml.Root;
}
catch
{
if (returnNullOnError)
return null;
throw;
}
}
public static object DeSerialize(XElement xmlSerialized, Type objectType)
{
XmlSerializer serializer = new XmlSerializer(objectType);
XDocument d = new XDocument(xmlSerialized);
object obj = null;
using (XmlReader r = d.CreateReader())
{
obj = serializer.Deserialize(r);
}
return obj;
}