来自多个XML的XSD生成器

时间:2009-06-30 19:42:00

标签: xml xsd

我知道可以从XML生成骨架XSD。例如,post有很好的答案。

问题是如何基于几个 XML生成XSD。这个想法是每个XML可能有几个不同的可选,数组,选择等。 从所有这些例子中,我想编写最准确的XSD。

我知道可能存在冲突等,但假设所有的XML都来自一个未知的XSD,那么它应该是理论上可行的。但是有这样的工具吗?

由于

5 个答案:

答案 0 :(得分:16)

Trang就是由着名的詹姆斯·克拉克写的这样一个工具。它可以在不同形式的xml定义之间进行转换,例如Relax NG normal和compact syntax,old school DTD和XML schema。它还可以从一个或多个xml文件中推断出架构。

如果你运行ubuntu trang打包在Universe存储库中,但该版本似乎有点坏了,从上面的链接中干净下载可能是你最好的选择。假设trang.jar位于当前目录中:

java -jar trang.jar -I xml -O xsd file1.xml file2.xml definition.xsd

应该做你想做的事。

答案 1 :(得分:4)

.Net 4.5有架构推理......

https://msdn.microsoft.com/en-us/library/xz2797k1(v=vs.110).aspx

这可以接受多个来源!

我需要这个,所以我写了代码,不妨分享,传入多个文件路径,第一个文件路径是你要编写的xsd文件,后续文件是输入的Xml文件。这是一个控制台应用程序。

using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;

namespace SchemaInferrer
{
    class Program
    {
        static void Main(string[] args)
        {
            string xsdFile="";
            string[] xmlFiles=null;
            DivideArguments(args, ref xsdFile, ref xmlFiles);

            if (FilesExist(xmlFiles))
            {
                Console.WriteLine("All files exist, good to infer...");
                XmlSchemaSet schemaSet = new XmlSchemaSet();
                XmlSchemaInference inference = new XmlSchemaInference();


                bool bFirstTime = true;
                foreach (string sFile in xmlFiles)
                {
                    XmlReader reader = XmlReader.Create(sFile);
                    if (bFirstTime)
                    {
                        schemaSet = inference.InferSchema(reader);
                    } else
                    {
                        schemaSet = inference.InferSchema(reader, schemaSet );
                    }
                    bFirstTime = false;
                }


                XmlWriterSettings xmlWriterSettings = new XmlWriterSettings()
                {
                    Indent = true,
                    IndentChars = "\t"
                };

                XmlWriter writer = XmlWriter.Create(xsdFile, xmlWriterSettings);

                foreach (XmlSchema schema in schemaSet.Schemas())
                {

                    //schema.Write(Console.Out);
                    schema.Write(writer);
                }
                Console.WriteLine("Finished, wrote file to {0}...",xsdFile);
                //Console.ReadLine();   
            }

        }

        static void DivideArguments(string [] args, ref string xsdFile, ref string[] xmlFiles)
        {
            xsdFile = args[0];
            xmlFiles=new string[args.Length-1];

            for (int i = 0; i < args.Length-1; i++)
            {
                xmlFiles[i] = args[i + 1];
            }
        }

        static bool FilesExist(string[] args)
        {
            bool bFilesExist=true; //* until proven otherwise

            if (args.Length>0)
            {
                foreach (string sFile in args )
                {
                if (!File.Exists(sFile) )
                    bFilesExist=false; 
                }
            }
            return bFilesExist;
        }
    }
}

答案 2 :(得分:1)

这是我正在寻找的链接。只是想我会分享,以防其他人帮助:http://blog.altova.com/generating-a-schema-from-multiple-xml-instances/

答案 3 :(得分:0)

这是从一个XML创建模式的代码: 演示如何使用此类的代码示例(它假定存在“XmlSchemaSet set”类成员累积结果并将其从调用调用到其中):

        var si = new XmlSchemaInference();
        var reader = XmlReader.Create(new StringReader(textBox1.Text));
        var en = si.InferSchema(reader, set).Schemas().GetEnumerator();
        en.MoveNext();
        var schema = en.Current as XmlSchema;
        var stream = new MemoryStream();
        if (schema != null)
        {
            schema.Write(stream);
            set.Add(schema);
        }
        stream.Flush();
        stream.Position = 0;
        var streamReader = new StreamReader(stream);
        var str = streamReader.ReadToEnd();
        grid1.Model.LoadSchema(str);
        reader.Close();
        stream.Close();
        streamReader.Close();

如果再次运行它并为XMLSchemaInference提供生成的模式和另一个XML,它将增强模式

答案 4 :(得分:0)

我用这个: https://xmlbeans.apache.org/docs/2.0.0/guide/tools.html#inst2xsd

需要几个xml实例并为您创建xsd。您可以选择3种“架构设计类型”。默认的一个适合我。

这是一个很棒的工具,我已经使用它多年了。不确定项目是否处于活动状态。试一试。