【问题标题】:Error: It was detected that X is in namespace Y, but components from this namespace are not referenceable from schema document错误:检测到 X 位于命名空间 Y 中,但此命名空间中的组件不可从架构文档中引用
【发布时间】:2017-09-03 10:18:27
【问题描述】:
这个 xsd 元素有什么问题?
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="MessageInfoType">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="1" name="TimeStamp" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="GetData">
<xsd:annotation>
<xsd:documentation>Send data</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" name="MessageInfo" type="xsd:MessageInfoType" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
收到错误 MessageInfoType 未声明。
【问题讨论】:
标签:
xml
xsd
xsd-validation
xml-validation
【解决方案1】:
错误信息,
src-resolve.4.2:解析组件“xsd:MessageInfoType”时出错。它
检测到“xsd:MessageInfoType”在命名空间中
'http://www.w3.org/2001/XMLSchema',但来自此命名空间的组件
不能从架构文档中引用
XSD 文件名。如果这是
命名空间不正确,可能需要 'xsd:MessageInfoType' 的前缀
被改变。如果这是正确的命名空间,那么适当的
'import' 标签应该被添加到
XSD 文件名。
当一个组件被引用但在给定的命名空间中找不到时发生。
在您的情况下,您通过向 type="xsd:MessageInfoType" 添加不必要的命名空间前缀和在 XSD 根元素上添加不必要的默认命名空间前缀来阻止成功引用 MessageInfoType。
如何解决:从xsd:schema中移除默认命名空间声明,并从MessageInfo的声明中移除type="xsd:MessageInfoType"中的命名空间前缀:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="MessageInfoType">
<xsd:sequence>
<xsd:element name="TimeStamp" type="xsd:string"
minOccurs="0" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="GetData">
<xsd:annotation>
<xsd:documentation>Send data</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="MessageInfo" type="MessageInfoType"
minOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
然后错误信息就会消失。