如何编译使用DataSet(xs:schema)的模式?

Yar*_*veh 5 xml xsd xmlschemaset

我在c#中创建了最简单的Web服务:

public void AddData(DataSet ds)
Run Code Online (Sandbox Code Playgroud)

生成的模式(Wsdl)如下所示:

<s:schema xmlns:s="http://www.w3.org/2001/XMLSchema">
...
<s:element ref="s:schema" />
...
</s:schema>
Run Code Online (Sandbox Code Playgroud)

请注意,架构不包含任何import/include元素.

我正在尝试将此架构加载到ac#System.Xml.XmlSchema并将其添加到System.Xml.XmlSchemaSet:

var set = new XmlSchemaSet();
var fs = new FileStream(@"c:\temp\schema.xsd", FileMode.Open);
var s = XmlSchema.Read(fs, null);
set.Add(s);            
set.Compile();
Run Code Online (Sandbox Code Playgroud)

最后一行抛出此异常:

The 'http://www.w3.org/2001/XMLSchema:schema' element is not declared.
Run Code Online (Sandbox Code Playgroud)

这有点意义:.Net生成的模式使用"s:schema"类型,该类型在未导入的模式中声明.

  1. 为什么.Net会创建一个无效的架构?
  2. 如何编译架构呢?我做的是在http://www.w3.org/2001/XMLSchema下载模式,并将其添加到XmlSchemaSet中.这不起作用,因为在线模式包含DTD定义.我不得不手动删除它,现在一切正常.这有意义还是我错过了什么?

Pet*_*dea 2

  1. 我会称之为错误。不过,看到 XML 模式引用http://www.w3.org/2001/XMLSchema命名空间中的元素是很不寻常的。
  2. 你所做的就是正确的方式——几乎;一般来说,您应该能够编译使用 DOCTYPE 引用的 XML 架构文件;只需确保 DTD 在指定位置可用(或通过 XML 解析器可用),并且您的阅读器设置配置为不禁止 DTD 处理(XmlReaderSettings 上已废弃的 ProhibitDtd 或 DtdProcessing 属性,默认情况下这些属性为 true)。