2016-04-12 102 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