将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中的节点与Entity框架类匹配

如果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;
    }