使用XmlSchemaInference和XDocument从XML以编程方式创建XSD方案

本文关键字:方式 编程 创建 XSD 方案 XML XmlSchemaInference XDocument 使用 | 更新日期: 2023-09-27 18:01:02

我知道这个板上有几个关于.xsd方案创建的答案,但我没有发现真正适合我想要做的事情。

我有一个非常简单的XML文件,里面有嵌套的元素等(但没有名称空间或dtd(,我正试图用它生成XSD文件。我反映了Microsoft XSD.exe中的代码(在生成XSD时经常提到它(,并看到使用XmlSchemaInference类(InferScheme()方法(生成方案。

现在,我的XML文件已经使用XDocument.Load()LINQ-命名空间加载了。但当我查看XmlSchemaInference时,我发现它只将XmlTextReader作为xml文档参数。

我是否正确地必须加载我的XML文件以与LINQ一起用作XDocument,然后使用XmlTextReader再次加载它以创建XSD?或者XDocument提供了类似的方法,因为它包含了扩展方法.Validate()

当谈到XML时,我很困惑,因为.net似乎提供了数百个类,但没有一个能够提供完整的功能。:/

简而言之,我想做的是:

  • 使用XDocument(LINQ(加载XML文件
  • 使用本机框架/XmlSchemeSet方法创建XSD方案(没有xsd.exe内容(来自XDocument
  • 使用新的XDocument对象,使用XDocument.Save()保存

我似乎要做的事:

  • 使用XDocument加载XML文件
  • 使用XmlTextReader再次加载XML文件
  • XmlTextReader传递到XmlSchemaInference
  • 将新的XmlTextWriter传递给XmlSchemaInference
  • 使用XmlTextWriter保存文档

真可笑,mh?

使用XmlSchemaInference和XDocument从XML以编程方式创建XSD方案

好的XmlSchemaInference.InferSchema将任何XmlReader作为输入,因此假设您有一个LINQ to XML XDocument,则可以使用http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.createreader.aspx.然后,由于XML文档通常可以包含来自不同命名空间的XML元素,因此InferSchema方法返回一个XmlSchemaSet(因为每个目标命名空间都需要一个架构(。有了XmlSchemaSet,您就有了将架构保存到文件中的所有选项,或者如果您想要一个XDocument,您可以使用例如创建一个

List<XDocument> schemas = new List<XDocument>();
foreach (XmlSchema schema in schemaSet.Schemas())
{
  XDocument schemaDoc = new XDocument();
  using (XmlWriter xw = schemaDoc.CreateWriter())
  {
     schema.Write(xw);
  }
  schemas.Add(schemaDoc);
}

XmlTextWriter和XmlTextReader是XmlWriter/XmlReader的遗留实现,除非您需要一些向后兼容的古怪XML解析或编写,否则最好避免使用它们。

但一般来说,XmlReader和XmlWriter类是.NET框架的XMLAPI中使用的类,用于提供不同类之间的低级别交互。

但是,从您的描述中还不清楚,如果您希望将架构作为XDocument实例,如果您只是想将架构保存到文件中,则可以直接调用该架构。为文件流上的每个架构编写方法。