本地schemaLocation

时间:2012-03-01 10:57:19

标签: xml xsd

我有一个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

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

  

服务器无法处理请求。 ---&GT;无法从位置“http://schemas.microsoft.com/sqlserver/2004/sqltypes ./bin/sqltypes.xsd”加载架构 - W3C XML架构的根元素应为,且其名称空间应为“http://www.w3.org/2001/XMLSchema”..

我是XML Schemas的新手,仍然试图了解这一点。

2 个答案:

答案 0 :(得分:1)

好的,看起来schemaLocation在该上下文中有不同的语法(疯狂,对吧?)。通常,它需要“$ namespace $ address”(即两个参数,用空格分隔 - 实际上是这样的对的列表),如你所说。

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

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

以下是定义<import>的规范,schemaLocation显然只是一个uri: http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#composition-schemaImport

为了比较,这里是<xsi:schemaLocation>的定义(注意“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

答案 1 :(得分:0)

Schema location属性包含一对值“namespace”,后跟“schema location”。

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

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

添加“./bin/sqlTypes.xsd”告诉解析器它可以从正在加载的XML文件的相对路径加载文件。为了使这个工作XSD文件(及其所有导入/包含)需要在这个位置,我猜不是吗?