基于.NET实体创建XML和XSD文件

时间:2010-10-15 19:27:03

标签: xml entity-framework serialization xsd

我一直在寻找这个问题很长一段时间,似乎无处可去。我需要找到一种方法来完成以下两个任务,基于.Net Entity对象:

  1. 创建一个XML文件,其中包含此实体中的数据,完整,带有级联节点(基本上代表外键关系)。我已经考虑过将数据复制到DataSet然后在它上面写一个WriteXml(),但这似乎有点过分了。实体必须有更直接的方式。但请注意,我不是要尝试序列化对象。我只需要一个简单的XML文件中的数据。
  2. 与第1点相关,我还需要保存一个代表该实体模式的XSD,与上面提到的XML齐头并进。再次,通过DataSet然后WriteXmlSchema()是一个选项,但感觉有点矫枉过正。
  3. Entity Universe中是否有任何可以帮助您以简单方式执行此操作的内容?

    THX。

1 个答案:

答案 0 :(得分:2)

我认为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中推断出架构。通过将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);
            }
        }
    }
}

它没有比这简单。