【问题标题】:Creating XML and XSD files based on .NET entities基于 .NET 实体创建 XML 和 XSD 文件
【发布时间】:2010-10-15 19:27:03
【问题描述】:

我一直在四处寻找这个,但似乎无处可去。我需要找到一种基于 .Net Entity 对象的方法来完成以下两项任务:

  1. 创建一个 XML 文件,其中包含此实体中的完整数据,并带有级联节点(基本上表示外键关系)。我考虑过将数据复制到 DataSet,然后对其执行 WriteXml(),但这似乎有点过头了。实体必须有更直接的方式。但请注意,我并不是要序列化对象。我只需要一个简单的 XML 文件中的数据。
  2. 与第 1 点相关,我还需要保存一个表示此实体架构的 XSD,以便与上述 XML 一起使用。同样,通过 DataSet 然后 WriteXmlSchema() 是一种选择,但感觉有点矫枉过正。

在实体世界中是否有任何东西可以帮助您以简单的方式做到这一点?

谢谢。

【问题讨论】:

    标签: xml entity-framework serialization xsd


    【解决方案1】:

    我认为 XML 序列化和模式推断的组合可能就是您所需要的。

    XmlSerializer 应该足以生成您正在寻找的 XML 文件。除了传入流或流编写器以及根级实体的实例之外,您实际上不需要做任何事情。 XML序列化的实际代码是2行:

    // for example:
    public static void Serialize<T> (T data, TextWriter writer)
    {
        var xs = new XmlSerializer(typeof(T))
        xs.Serialize(writer, data);  // write out the xml to the stream writer...
    }
    

    我不确定您为什么要避免 XML 序列化。

    为了保存相对于实体集的 XSD,您可以从生成的 XML 推断架构。 Schema 推断是通过将 XmlSchemaInference 类与 XmlSchemaSet 结合使用来完成的。

    无论我走到哪里,我通常都会为自己创建一个小型架构推理实用程序,它看起来像这样:

    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("Nothing to do.");
                return;
            }
    
            // first arg should contain the path to xml else error
            Console.WriteLine("Inferring schema of: {0}", args[0]);
    
            // default output should be xml name part + .xsd
            InferSchema(args[0]);
        }
    
        static void InferSchema(string fileName)
        {
            XmlWriter writer = null;
            XmlSchemaInference infer = new XmlSchemaInference();
            XmlSchemaSet sc = new XmlSchemaSet();
    
            string outputXsd = fileName.Replace(".xml", ".xsd");
            sc = infer.InferSchema(new XmlTextReader(fileName));
    
            using (writer = 
                XmlWriter.Create(new StreamWriter(outputXsd)))
            {
                foreach(XmlSchema schema in sc.Schemas())
                {
                    schema.Write(writer);
                    Console.WriteLine(">> found schema - generated to {0}", 
                        outputXsd);
                }
            }
        }
    }
    

    没有比这更简单的了。

    【讨论】:

    • 感谢您的快速回答。重新序列化 - 老实说,不确定我为什么要避免它。我的印象是,序列化文件会给我更多关于类的信息,而不仅仅是结构或数据。重新考虑它,你可能是对的。需要mroe咖啡。至于 XSD - 我一定会尝试一下。看起来这可能有效。谢谢一堆!
    • 好吧,我开始对此进行测试,但遇到了奇怪的结果。我得到了序列化的工作,但得到的 XML 文件只不过是一个描述实体中主表的头标记。没有数据。我确保延迟加载已关闭,甚至“监视”检索到的对象以确保它有数据,但没有运气。我会继续挖掘。有什么想法吗?
    • 次要更新 - 序列化程序没有做太多,因为我定义的对象类型是 var 类型,而不是实际的 EntityType。我现在的问题是只有来自顶级 EntityType 的数据被序列化;即使我在 Linq 查询中使用 .Include() 引用它们的导航属性,我也没有从子表中得到任何信息。哇哇哇。
    • 好的,XML 序列化的大问题 - 它不处理相关对象。只有二​​进制和 WCF 序列化会这样做:“当您使用二进制序列化和 WCF 数据协定序列化时,如果正在序列化的对象在对象图中有相关对象,那么这些对象也会被序列化。XML 序列化不会序列化相关对象。”。请参阅“msdn.microsoft.com/en-us/library/bb738446.aspx”。
    • 好的,我想我找到了。简单的 XML 序列化不起作用,因为它不包含引用的属性(即子表)。不过,DataContractSerializer 确实有效。在这里找到一篇很好的文章:riggshill.com/home/taxonomy/term/37。谢谢你让我走上正确的道路,code4life!
    猜你喜欢
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多