2013-02-09 65 views
1

的XML(簡化):XML不會驗證對某些XSD

<?xml version="1.0" encoding="UTF-8"?> 
<mx:XMLimport xmlns:mx="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Leverancier>nn</Leverancier> 
    <Bestandsversie>1.1.0.0</Bestandsversie> 
</mx:XMLimport> 

的XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified"> 
    <xsd:element name="XMLimport"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="Leverancier" type="xsd:string" minOccurs="1"/> 
       <xsd:element name="Bestandsversie" type="xsd:string" minOccurs="1"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

如果我從XML的根元素除去mx:前綴它驗證剛精細。我迷失在名字空間中,現在我正在網上搜索幾個小時。我無法更改XML,因此必須修改XSD以允許使用mx:前綴。驗證器出現此錯誤:

ERROR: Element '{http://www.w3.org/2001/XMLSchema}XMLimport': 
     No matching global declaration available for the validation root. 
+1

該XML有一些非常錯誤的地方。它使用'http:// www.w3.org/2001/XMLSchema'作爲它的命名空間,這顯然是XSD格式的命名空間(據我所知,它沒有'XMLimport'元素)。你從哪裏得到這個XML? – JLRishe 2013-02-09 15:27:01

+0

嗨JL,XML來自供應商,供應商不能/不會改變它。如果我只是從XML中刪除「mx:」前綴,它工作正常。由於這是不可能的生產方式,我必須改變我自己的XSD。 – HerbertV 2013-02-09 15:34:11

+1

你不是唯一一個在XML命名空間方面丟失的人 - 那個XML的來源顯然也失去了。名稱空間http://www.w3.org/2001/XMLSchema中沒有XMLImport元素。如果供應商真的不能或不會改變它,我會建議找一個新的供應商。如果您不能或不會這樣做,請修正XML:在驗證之前通過篩選器運行它以清理名稱空間聲明。 – 2013-02-10 19:08:05

回答

2

我假設您的問題是XSD應該如何匹配您的XML。這是糾正XSD:

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xsd:schema targetNamespace="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="XMLimport"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="Leverancier" type="xsd:string"/> 
       <xsd:element name="Bestandsversie" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

您的XSD沒有定義targetNamespace屬性。因此,您的XMLimport必須在實例文檔中顯示沒有名稱空間;這就是爲什麼當您從XML文檔中的XMLimport中刪除名稱空間時,它將變爲有效。

如果您添加targetNamespace="http://www.w3.org/2001/XMLSchema",您現在將擁有一個XSD來驗證您的XML;通常,targetNamespace的值必須與文檔元素的名稱空間相匹配(變色龍XSD是特殊情況)。

在這裏玩的另一件事是elementFormDefault默認爲unqualified。該設置是使內部元素LeverancierBestandsversie沒有名稱空間的設置。

另一件需要注意的事情是,儘管看到用戶定義的內容定位於http://www.w3.org/2001/XMLSchema名稱空間的情況非常罕見,但XSD 1.0規範中沒有規定明確禁止用戶定位此名稱空間。這與您在示例XML中看到的其他名稱空間不同,http://www.w3.org/2001/XMLSchema-instance:明確禁止在用戶定義的XSD中定位此名稱空間。

This SO post也可能有幫助。

+0

源XML的'Leverancier'和'Bestandsversie'元素似乎位於空名稱空間中。這不是說他們需要在單獨的XSD中進行定義嗎? – JLRishe 2013-02-10 18:35:19

+0

@JLRishe,no;這就是我在迴應中指出'elementFormDefault'的原因。 – 2013-02-10 21:58:20