使用Xml Schema Inference和XDocument以编程方式从XML创建XSD架构

时间:2013-02-26 09:11:27

标签: c# xml linq linq-to-xml

我知道这个板上有几个关于.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
  • 保存文档

......非常荒谬,是吗?

1 个答案:

答案 0 :(得分:0)

XmlSchemaInference.InferSchema将任何XmlReader作为输入,因此假设您有一个LINQ to XML XDocument,您可以使用http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.createreader.aspx在该文档上创建一个XmlReader。然后,由于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的遗留实现,除非您需要一些向后兼容的quirk解析或XML编写,否则最好避免使用它们。

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

然而,从您的描述中不清楚您是否希望将模式作为XDocument实例,如果您只是想将模式保存到文件中,那么您可以直接调用每个模式的schema.Write方法在文件流上。