使用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.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实例,如果您只是想将架构保存到文件中,则可以直接调用该架构。为文件流上的每个架构编写方法。