【问题标题】:XSD generator from several XMLs来自多个 XML 的 XSD 生成器
【发布时间】:2010-11-07 03:02:48
【问题描述】:

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

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

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

谢谢

【问题讨论】:

标签: xml xsd


【解决方案1】:

Trang 就是著名的 James Clark 编写的这样一个工具。它可以在不同形式的 xml 定义之间进行转换,例如 Relax NG 正常和紧凑的语法、老式 DTD 和 XML 模式。它还可以从一个或多个 xml 文件中推断出架构。

注意:该项目已移至 Github。 http://github.com/relaxng/jing-trang 是 Trang 仓库的新位置

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

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

应该做你想做的。

【讨论】:

  • Trang 主页仍链接到 Google Code,但该项目已移至 Github。对于将来找到它的任何其他人,github.com/relaxng/jing-trang 是 Trang 存储库的新位置。
  • @ryanStull:你能举个例子吗?我刚刚使用 Trang 从一组精心构建的四个 xml 文件中制作了一个 xsd,另一个使用 freeformatter.com 从单个文件中制作了一个 xsd。它们非常不同,我还需要一段时间才能确定要开始添加我自己的验证。
【解决方案2】:

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

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

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

【讨论】:

  • 请在您的回答中添加详细信息,例如您的使用方式、步骤等。
  • 它是一个命令行工具。而且我认为手册页(链接)解释得很好。
【解决方案3】:

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

【讨论】:

    【解决方案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;
            }
        }
    }
    

    【讨论】:

      【解决方案5】:

      这是从一个 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();
      

      如果再次运行它并将生成的架构和另一个 XML 提供给 XMLSchemaInference,它将增强架构

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        • 2016-01-27
        • 2011-08-18
        • 1970-01-01
        相关资源
        最近更新 更多