我知道可以从XML生成骨架XSD。例如,post有很好的答案。
问题是如何基于几个 XML生成XSD。这个想法是每个XML可能有几个不同的可选,数组,选择等。 从所有这些例子中,我想编写最准确的XSD。
我知道可能存在冲突等,但假设所有的XML都来自一个未知的XSD,那么它应该是理论上可行的。但是有这样的工具吗?
由于
答案 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种“架构设计类型”。默认的一个适合我。
这是一个很棒的工具,我已经使用它多年了。不确定项目是否处于活动状态。试一试。