来自多个XML的XSD生成器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自多个XML的XSD生成器相关的知识,希望对你有一定的参考价值。

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

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

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

谢谢

答案

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

应该做你想做的事。

另一答案

.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;
        }
    }
}
另一答案

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

另一答案

这是从一个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,它将增强模式

另一答案

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

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

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

以上是关于来自多个XML的XSD生成器的主要内容,如果未能解决你的问题,请参考以下文章

如何用C或c++写一段代码读取xsd结构生成一个XML文件,现在我有数据文件和XSD文件

XSD 代码生成器 [关闭]

以编程方式从 XML 或 XSD 生成 C# 类

要针对多个 xsd 模式验证 XML

XSD2Code++,从 XML 枚举到没有顺序值的 C# 枚举

VB中使用XSD生成的类读取XML示例