【问题标题】:Local schemaLocation本地架构位置
【发布时间】:2012-03-01 10:57:19
【问题描述】:

我有一个 XSD 文件,我用它来验证一些 XML 数据,并且在我自己的 PC 上它工作得很好。但是,当在没有网络的计算机上时,它会失败并出现此错误

服务器无法处理请求。 ---> 类型 'http://schemas.microsoft.com/sqlserver/2004/sqltypes:nvarchar' 未声明,或者不是简单类型。

然而,这在其他地方也能完美运行。

我的XSD文件开头如下

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:schema="DataLoad" xmlns:xsd="http://www.w3.org/2001/XMLSchema"     xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />

经过一番研究,我尝试将schemaLocation 属性更改为

schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes ./bin/sqlTypes.xsd"

显然,那应该从 ./bin/sqlTypes.xsd 加载(我将 MS 的本地副本保存到 ./bin/sqlTypes.xsd

但是现在,我收到了这个错误...

服务器无法处理请求。 ---> 无法从位置 'http://schemas.microsoft.com/sqlserver/2004/sqltypes ./bin/sqltypes.xsd' 加载架构 - W3C XML Schema 的根元素应该是,其命名空间应该是 'http://www.w3.org/2001/XMLSchema'..

我是 XML Schemas 的新手,但仍在努力解决这个问题。

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    好的,看起来schemaLocation 在该上下文中具有不同的语法(很疯狂,对吗?)。通常,如您所说,它采用“$namespace $address”(即两个参数,由空格分隔 - 实际上是此类对的列表)。

    但是在&lt;import&gt; 元素中,有一个命名空间的特殊属性(称为namespace),而schemaLocation 现在只包含地址。这有任何意义吗?不,我认为这对您的示例意味着什么:

    <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes"
      schemaLocation="./bin/sqlTypes.xsd" />
    

    这是定义 &lt;import&gt; 的规范,schemaLocation 显然只是一个 uri: http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#composition-schemaImport

    为了比较,这里是&lt;xsi:schemaLocation&gt; 的定义(注意“xsi” - 它位于不同的命名空间中,因此它们可以有不同的定义,只是使用相同的名称会造成不必要的混淆): http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#xsi.schemaLocation

    xml 模式“primer”也区分了这些用途:http://www.w3.org/TR/xmlschema-0/#schemaLocation

    【讨论】:

      【解决方案2】:

      架构位置属性包含一对值“命名空间”,后跟“架构位置”。

      在您的本地计算机上,您的应用程序似乎能够神奇地从命名空间“http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd”解析架构并加载架构(或者它不进行验证)。我需要知道它如何加载 XML 文件以确定如何执行此命名空间到模式位置的映射。

      注意虽然命名空间“http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd”看起来像一个url,但它只是一个标记,并不能直接告诉架构所在的解析器。

      添加“./bin/sqlTypes.xsd”告诉解析器它可以从正在加载的 XML 文件的相对路径加载文件。为此,XSD 文件(及其所有导入/包含)需要位于此位置,我猜那里没有?

      【讨论】:

      • 文件位于正确的位置,除非我的行 schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes ./bin/sqlTypes.xsd" 格式不正确? -- 到目前为止,解决它的唯一方法是更改​​客户防火墙以允许服务器出站连接。
      猜你喜欢
      • 1970-01-01
      • 2015-02-27
      • 2015-05-08
      • 2010-12-18
      • 2015-03-22
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多