代码之家  ›  专栏  ›  技术社区  ›  Yaron Naveh

如何编译使用数据集的架构(xs:schema)?

  •  5
  • Yaron Naveh  · 技术社区  · 15 年前

    我用c_创建了最简单的web服务:

    public void AddData(DataSet ds)
    

    生成的架构(wsdl)如下所示:

    <s:schema xmlns:s="http://www.w3.org/2001/XMLSchema">
    ...
    <s:element ref="s:schema" />
    ...
    </s:schema>
    

    注意,架构不包含任何导入/包含元素。

    我正试图将此架构加载到c system.xml.xml schema并将其添加到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();
    

    最后一行引发此异常:

    The 'http://www.w3.org/2001/XMLSchema:schema' element is not declared.
    

    这有点道理:由.NET生成的架构使用“s:schema”类型,该类型在未导入的架构中声明。

    1. 为什么.NET创建无效架构?
    2. 无论如何,如何编译模式?我所做的是在 http://www.w3.org/2001/XMLSchema 并将其添加到xmlschemaset中。这不起作用,因为联机架构包含DTD定义。我不得不手动移除它,现在一切正常。这有意义吗?还是我遗漏了什么?
    2 回复  |  直到 10 年前
        1
  •  2
  •   Petru Gardea    14 年前
    1. 我叫它虫子。不过,看到XML模式引用来自 http://www.w3.org/2001/XMLSchema 命名空间。
    2. 您所做的几乎是正确的;一般来说,您应该能够编译使用doctype引用的xml模式文件;只要确保dtd在指定位置可用(或通过xml解析器可用),并且您的读取器设置配置为不禁止dtd p处理(xmlreadersettings上已废弃的prohibitdtd或dtdprocessing属性,默认情况下为true)。
        2
  •  -1
  •   NitrusCS    10 年前

    这意味着服务没有足够的信息来为元素构建有意义的格式,因此它生成一个wsdl,实质上是说“我将发送一些排序xml,但我不知道它是什么样子的”。我们需要进一步构建服务的结构,以便wsdl生成器可以创建有意义的架构。