2

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

我有一个非常简单的 XML 文件,其中包含嵌套元素等(但没有命名空间或 dtd),我正在尝试从中生成一个 XSD 文件。我反映了 Microsoft 的代码XSD.exe(在 XSD 生成方面经常被提及),并看到方案生成是通过使用XmlSchemaInference类(InferScheme()方法)完成的。

现在,我的 XML 文件已经使用-namespace加载XDocument.Load()了。LINQ但是当我查看时XmlSchemaInference,我发现这只需要一个XmlTextReader作为 xml 文档参数。

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

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

简而言之,我想做的是:

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

看来我必须做的:

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

……很可笑,嗯?

4

1 回答 1

0

那么XmlSchemaInference.InferSchema将任何 XmlReader 作为输入,因此假设您有一个 LINQ to XML XDocument,您可以使用http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument在该文档上创建一个 XmlReader .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 框架的 XML API 中用于提供不同类之间的低级别交互的类。

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

于 2013-02-26T15:13:15.560 回答