2013-04-28 85 views
0

之間有什麼區別(上前綴^ h焦點:, C:一:和默認):進口模式和命名空間

<?xml version="1.0" encoding="UTF-8"?> 
<xmlBoo xmlns="http://www.example.org/boo" 
     xmlns:c="http://www.example.org/customer" 
     xmlns:a="http://www.example.org/address" 
     xmlns:h="http://www.example.org/header"> 
    <h:header> 
     <h:id>101</h:id> 
    </h:header> 
    <c:customer> 
     <c:id>1</c:id> 
     <c:name>John</c:name> 
     <a:address> 
     <a:street>Long street</a:street> 
     </a:address> 
    </c:customer> 
    <someBooSpecificField>Specific data in Boo</someBooSpecificField> 
</xmlBoo> 

<?xml version="1.0" encoding="UTF-8"?> 
<xmlBoo xmlns="http://www.example.org/boo" 
     xmlns:c="http://www.example.org/customer" 
     xmlns:a="http://www.example.org/address" 
     xmlns:h="http://www.example.org/header"> 
    <header> 
     <h:id>101</h:id> 
    </header> 
    <customer> 
     <c:id>1</c:id> 
     <c:name>John</c:name> 
     <address> 
     <a:street>Long street</a:street> 
     </address> 
    </customer> 
    <someBooSpecificField>Specific data in Boo</someBooSpecificField> 
</xmlBoo> 

我問我原因我已經通過JAXB和marshaller實現了映射,創建了第一個xml。但是當我添加模式驗證時,我得到了異常:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'ns3:header'. One of '{"http://www.example.org/boo":header}' is expected. 

看起來,驗證器期望(基於模式)第二個XML。

哪個前綴應該是元素頭之前? 默認(與命名空間連通[http://www.example.org/boo])或H:(與命名空間連通[http://www.example.org/header])。

我認爲整個元素標題與h完全連接:不僅僅是像第二個例子中的子元素。最佳實踐是什麼,對此的解釋是什麼。

我的XML模式:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:h="http://www.example.org/header" 
      xmlns:c="http://www.example.org/customer" 
      targetNamespace="http://www.example.org/boo" 
      elementFormDefault="qualified"> 

    <xsd:import namespace="http://www.example.org/header" schemaLocation="header.xsd"/> 
    <xsd:import namespace="http://www.example.org/customer" schemaLocation="customer.xsd"/> 

    <xsd:element name="xmlBoo"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="header" type="h:header"/> 
       <xsd:element name="customer" type="c:customer"/> 
       <xsd:element name="someBooSpecificField" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

和EG。 header.xsd

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

    <xsd:complexType name="header"> 
     <xsd:sequence> 
      <xsd:element name="id" type="xsd:long"/> 
     </xsd:sequence> 
    </xsd:complexType> 

</xsd:schema> 

回答

2

第二個XML示例是正確的,如您的模式驗證所示。

我想你混淆了元素的命名空間的類型的命名空間。行 < xsd:element name =「header」type =「h:header」> 在模式中定義名稱空間中名爲「header」的元素,該元素在「http://www.example.org/header」命名空間中爲「header」類型。

考慮XML是什麼樣子,如果行是不是 < XSD:元素名稱= 「myHeader」 TYPE = 「H:頭」 >

+0

你是完全正確的,謝謝你。 – Ziletka 2013-04-30 16:16:25

+0

不錯的提示,thx! +1 – JBA 2013-09-24 12:27:29