gpt4 book ai didi

c# - 使用 Xml Schema Inference 和 XDocument 以编程方式从 XML 创建 XSD schema

转载 作者:太空宇宙 更新时间:2023-11-03 16:18:00 26 4
gpt4 key购买 nike

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

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

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

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

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

简而言之,我想做的是:

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

看来我必须做的事情:

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

...很荒谬,嗯?

最佳答案

XmlSchemaInference.InferSchema将任何 XmlReader 作为输入,因此假设您有一个 LINQ to XML XDocument,您可以使用 http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.createreader.aspx 在该文档上创建一个 XmlReader .然后,由于 XML 文档通常可以包含来自不同 namespace 的 XML 元素,因此 InferSchema 方法返回一个 XmlSchemaSet(因为每个目标 namespace 都需要一个架构)。使用该 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 方法在文件流上。

关于c# - 使用 Xml Schema Inference 和 XDocument 以编程方式从 XML 创建 XSD schema,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15085155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com