2010-04-14 50 views
0

嘗試從XML模式導入共享定義時,我可以正確引用共享類型,但引用共享元素會導致驗證錯誤。XML模式:導入共享元素時的名稱空間問題

這是進口共享定義模式(example.xsd):

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

    <xs:import namespace="http://shared.com" schemaLocation="shared.xsd"/> 

    <xs:element name="example"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="importedElement"/> 
       <xs:element ref="importedType"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="importedElement"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="shared:fooElement"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="importedType"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="bar" type="shared:barType"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

</xs:schema> 

這些都是共享的定義(shared.xsd):

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://shared.com" 
    targetNamespace="http://shared.com"> 

    <xs:element name="fooElement"> 
     <xs:simpleType> 
      <xs:restriction base="xs:integer"/> 
     </xs:simpleType> 
    </xs:element> 

    <xs:simpleType name="barType"> 
     <xs:restriction base="xs:integer"/> 
    </xs:simpleType> 

</xs:schema> 

現在考慮這個XML實例:

<?xml version="1.0"?> 
<example 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      
    xsi:noNamespaceSchemaLocation="example.xsd"> 
    <importedElement> 
     <fooElement>42</fooElement> 
    </importedElement> 
    <importedType> 
     <bar>42</bar> 
    </importedType> 
</example> 

驗證時,「importedType」工作得很好,但「importedElement」給出S中的以下錯誤:

Invalid content was found starting with element 'fooElement'. One of '{" http://shared.com ":fooElement}' is expected

我猜想,我的煩惱都與命名空間的問題(因此在某種程度上誤導「了fooElement但期待fooElement」) - 在這裏有什麼不對任何提示?

回答

0

你引用fooElement,就好像是在沒有命名空間,您需要使用正確的名稱空間的實例文檔:

<?xml version="1.0"?> 
<example 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      
    xsi:noNamespaceSchemaLocation="example.xsd" xmlns:shared="http://shared.com"> 
    <importedElement> 
     <shared:fooElement>42</shared:fooElement> 
    </importedElement> 
    <importedType> 
     <bar>42</bar> 
    </importedType> 
</example> 

編輯:我應該指出:這是之間的差異類型元件;只有後者出現在文檔中(有一些例外),這就是爲什麼你的導入類型按照你想要的那樣工作,而你的元素不能。

+0

我接受了你的答案,因爲它解決了我的問題。不幸的是,它並沒有解決我的問題:XML實例文檔部署在客戶端,它不是一個改變它們的選項。任何允許從共享XSD導入元素的名稱空間魔術*不*需要在XML實例中進行調整? – netzwerg 2010-04-15 06:25:31

+0

那麼,是什麼讓你首先爲共享模式分配一個名稱空間呢?有什麼要求嗎?爲什麼不讓你的共享模式像你的郵件一樣沒有命名空間,並且使用include而不是import? – xcut 2010-04-15 07:28:15

+0

我們以後使用JAXB訪問XML文檔。通過導入,共享類型的Java對應部分不是真正共享的,而是爲每個XSD重新生成的,因此很難在其周圍編寫實用程序代碼。 – netzwerg 2010-04-15 09:26:42

相關問題