Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XMLSchemaReference和XDocument从XML以编程方式创建XSD方案_C#_Xml_Linq_Linq To Xml - Fatal编程技术网

C# 使用XMLSchemaReference和XDocument从XML以编程方式创建XSD方案

C# 使用XMLSchemaReference和XDocument从XML以编程方式创建XSD方案,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我知道关于.xsd方案的创建,在这个黑板上有几个答案,但我发现没有什么真正符合我的意图 我有一个包含嵌套元素等的非常简单的XML文件(但没有名称空间或dtd),我正试图从中生成一个XSD文件。我反映了MicrosoftXSD.exe中的代码(在生成XSD时经常会用到该代码),并看到通过使用xmlschemaReference类(InferScheme()方法)生成方案 现在,我的XML文件已经使用XDocument.Load()从LINQ-名称空间加载。但是当我查看XmlSchemaInfere

我知道关于.xsd方案的创建,在这个黑板上有几个答案,但我发现没有什么真正符合我的意图

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

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

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

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

简而言之,我想做的是:

  • 使用
    XDocument
    (LINQ)加载XML文件
  • 使用本机框架/
    XmlSchemeSet
    方法创建XSD方案(无
    XSD.exe
    stuff) 来自XDocument
  • 使用新的XDocument对象,使用
    XDocument.save()保存
我似乎必须做的是:

  • 使用
    XDocument
  • 使用
    XmlTextReader
  • XmlTextReader
    传递到
    XMLSchemaReference
  • 将新的
    XmlTextWriter
    传递给
    XMLSchemaReference
  • 使用
    XmlTextWriter
。。。非常可笑,mh?

我们会将任何XmlReader作为输入,因此假设您有一个LINQ到XML XDocument,您就可以在该文档上创建一个XmlReader。然后,由于XML文档通常可以包含来自不同名称空间的XML元素,因此Infreschema方法返回一个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);
}
List schemas=newlist();
foreach(schemaSet.Schemas()中的XmlSchema)
{
XDocument schemaDoc=新XDocument();
使用(XmlWriter xw=schemaDoc.CreateWriter())
{
schema.Write(xw);
}
schemas.Add(schemaDoc);
}
XmlTextWriter和XmlTextReader是XmlWriter/XmlReader的遗留实现,除非您需要一些向后兼容的XML解析或编写技巧,否则最好避免使用它们

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

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