我有一个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的新手,仍然试图了解这一点。
答案 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文件(及其所有导入/包含)需要在这个位置,我猜不是吗?