2016-04-12 50 views
2

我想验证我的XML与另一个XSD导入的XSD。无法验证导入的XSD

请看看下面的代码:

xml1.xml:

<e1 xmlns="n1" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="n2 main.xsd"> 
</e1> 

xsd1.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="n1" 
     elementFormDefault="qualified"> 
<xsd:element name="e1"/> 
</xsd:schema> 

main.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="n2" 
     elementFormDefault="qualified"> 

<xsd:import namespace = "n1" schemaLocation = "xsd1.xsd"/> 
</xsd:schema> 

验证xml1.xml(NetBeans中使用XML工具或JAVA)简单地抛出:

cvc-elt.1: Cannot find the declaration of element 'e1'. [3] 

可能是什么问题呢?

回答

2

您的型号xsi:schemaLocation需要调整。它是不包括包含声明自动将XSD带入范围;它是一个提示这说明了一个给定的名称空间,其中验证可能能够找到适当的XSD。

当你声明,xsi:schemaLocation="n2 main.xsd",你是在暗示要main.xsd寻找n2命名空间,但是你说一无所知实际上你的根元素相关联的n1命名空间。验证遇到的n1命名空间中的根元素,咨询你的提示,觉得没有什么,让你知道的:

cvc-elt.1: Cannot find the declaration of element 'e1'. [3] 

,因为它应该。你的前进道路是明确的:添加了一丝的n1命名空间的根元素:

xsi:schemaLocation="n2 main.xsd n1 xsd1.xsd" 

和你的XML文档将成功验证。

+0

谢谢!顺便说一句,我期望,因为我将xsd1模式导入到主模式中,只需引用主模块就足够了,因为它包含导入的名称空间。我开始意识到它不以这种方式工作,但我需要将导入的名称空间绑定到前缀,并在主架构中使用它。除此之外,我相信你的回答很好,再次感谢! – user1856926