2010-11-05 55 views
2

假設我有一個模式,它在命名空間「general」中定義了一個名爲「MyType」的複雜類型。當一個複雜類型被另一個命名空間中的另一個模式引用時,應該使用什麼XML命名空間?

然後在另一個模式中使用該複雜類型。

例如:

<xsd:schema targetNamespace="http://www.example.com/otherschema" 
      xmlns:general="http://www.example.com/genschema"> 
<xsd:import namespace="http://www.example.com/genschema" schemaLocation="general.xsd" /> 
<xsd:element ref="general:Mytype" /> 
<xsd:element name="myName" type="general:MyType" /> 

應該就是符合該模式使用otherschema或genschema的targetNamespace的XML文檔中的XML元素的命名空間。

<general:MyType /> 
or 
<targetNamespacePrefix:Mytype /> 

我在問這個問題,因爲我使用Axis2來生成Java代碼來與Web服務進行交互。 Axis2代碼對名稱空間進行了檢查,在上面的示例中,它將檢查名稱空間是否是通用名稱,如果不是,則會拋出異常。當然,Web服務響應xml使用targetNamespace而不是常規名稱空間,因此每次都會中斷。我對Axis2開發人員比Web服務的開發人員更有信心,但是我希望在提交錯誤報告之前確認我已經寫好了。

回答

0

您在「其他」模式中使用MyType是正確的:聲明名稱空間,使用import並使用聲明的前綴(general)。

<xsd:schema targetNamespace="http://www.example.com/otherschema" 
       xmlns:general="http://www.example.com/genschema"> 
    <xsd:import namespace="http://www.example.com/genschema" schemaLocation="general.xsd" /> 
    <xsd:element name="myName" type="general:MyType" /> 
</xsd> 

請注意,我做你的http://...項目明確要明確哪些是你所描述的情況通常是不同的。

如果你問在哪裏MyType定義的模式,在該模式使用前綴的名稱的定義:

<xsd:schema targetNamespace="http://www.example.com/genschema" 
    <xsd:complexType name="MyType"> ... </xsd:complexType> 
</xsd:schema> 

更新根據您的修改:

在XML實例文檔,使用myName將具有上述targetNamespace的「otherschema」的名稱空間。使用MyType將使用「genschema」命名空間。

我刪除了<xsd:element ref="general:MyType"/>,如果MyType是一個元素(不是類型),並且它在類型定義中,這纔有意義。假設「otherschema」載:

<xsd:complexType name="otherType> 
    ... 
    <xsd:element ref="general:MyElement"/> 
</xsd:complexType> 

在這種情況下,MyElement仍然會使用「genschema」命名空間中的XML實例文件內。

底線:導入項目不會更改其名稱空間。但是,包括它們在內,確實會改變名稱空間(即使用<xsd:include>

+0

我已經更新了問題,以便在您的答案中更清楚地從您的示例中明確瞭解XML文檔中符合此要求的元素schema應該用作命名空間,一般是定義複雜類型的地方,或者是使用類型的目標命名空間,我認爲它應該是通用的。 – DangerMouse 2011-05-27 16:05:08

相關問題