2012-07-25 107 views
1

我在我的項目上使用JAXB,但不時遇到一些我無法解決的問題。我已經安裝我的環境是這樣的:JAXB Unmarshall錯誤

護甲類

package com.fortresswars.entity.component; 

@XmlType(name = "armor", namespace = "http://fortresswars.com") 
public class ArmorComponent extends AbstractComponent 

package-info.java

@XmlSchema(xmlns = @XmlNs(namespaceURI = "http://fortresswars.com", prefix = "fw"), elementFormDefault = XmlNsForm.UNQUALIFIED, namespace = "http://fortresswars.com") 
package com.fortresswars.entity.component; 

生成的模式頭幾乎是正確的:

<xs:schema elementFormDefault="unqualified" version="1.0" targetNamespace="http://fortresswars.com" xmlns:fw="http://fortresswars.com" xmlns:tns="http://fortresswars.com" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

唯一我不喜歡的是JAXB放在那裏的TNS前綴,我無法刪除。我正在使用一個螞蟻任務(com.sun.tools.jxc.SchemaGenTask),我記得在某處讀到這是問題。

生成的方案的其餘部分如下。我會告訴大約只有盔甲的相關部分:

<xs:complexType name="armor"> 
    <xs:complexContent> 
     <xs:extension base="tns:abstractComponent"> 
     <xs:sequence> 
      <xs:element name="value" type="xs:short" minOccurs="0"/> 
      <xs:element name="type" type="tns:armor-type" minOccurs="0"/> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

就是用裝甲組件的元素:

<xs:complexType name="character"> 
    <xs:complexContent> 
     <xs:extension base="tns:thing"> 
     <xs:sequence> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
      <xs:element name="armor" type="tns:armor"/> 
      <xs:element name="model" type="tns:model"/> 
      <xs:element name="status" type="tns:status"/> 
      <xs:element name="costs" type="tns:costs"/> 
      </xs:choice> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

爲了測試這一點,我創建了一個XML文檔(見TNS前綴,我需要把它,或者fw前綴,以及xmlns:fw也)。

<?xml version="1.0" encoding="UTF-8"?><tns:character xmlns:tns="http://fortresswars.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="/home/shirkit/jMonkeyProjects/Fortress Wars/Core/schema/full.xsd"> 

<armor> 
<value>5</value> 
<type>NORMAL</type> 
</armor> 

</tns:character> 

但是,當我解組這個文件,這是我得到的錯誤:

Exception: unexpected element (uri:"", local:"armor"). Expected elements are <{http://fortresswars.com}armor>,<{http://fortresswars.com}attacks>,<{http://fortresswars.com}costs>,<{http://fortresswars.com}model>,<{http://fortresswars.com}abilities>,<{http://fortresswars.com}status>,<{http://fortresswars.com}movement> 

我有安裝將elementFormDefault不合格,即使這是行不通的。爲什麼我得到這個異常?我可以從生成的模式中刪除TNS前綴嗎?

+0

我不明白你期待什麼發生?一切都按照你目前定義的方式工作。 – jtahlborn 2012-07-25 17:35:59

+0

沒有@jtahlborn,我在嘗試解組創建的文檔時收到異常。異常消息寫在那裏,它是最後一個代碼塊。 – SHiRKiT 2012-07-25 17:44:40

+0

你說它適用於tns前綴? – jtahlborn 2012-07-25 17:57:55

回答

1

當您爲http://fortresswars.com的元素定義名稱空間前綴時,您需要以它爲前綴所有元素,而不僅僅是character。所以這應該工作

<?xml version="1.0" encoding="UTF-8"?> 
<tns:character 
    xmlns:tns="http://fortresswars.com" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="/home/shirkit/jMonkeyProjects/Fortress Wars/Core/schema/full.xsd"> 
    <tns:armor> 
     <tns:value>5</tns:value> 
     <tns:type>NORMAL</tns:type> 
    </tns:armor> 
</tns:character> 

模式中使用的tns前綴是無關你作爲前綴,你解組XML文本中使用。您可以在xmlns:whatyoulike="http://fortresswars.com"中選擇任何其他。將XML文檔中的元素連接到模式文件中的定義的關鍵是名稱空間URI,在您的情況下爲「http://fortresswars.com」。如果你定義命名空間爲默認命名空間,你可以省略每個元素的前綴:

<?xml version="1.0" encoding="UTF-8"?> 
<character 
    xmlns="http://fortresswars.com" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="/home/shirkit/jMonkeyProjects/Fortress Wars/Core/schema/full.xsd"> 
    <armor> 
     <value>5</value> 
     <type>NORMAL</type> 
    </armor> 
</character> 

在XSD文件中的命名空間前綴有助於避免名稱衝突,如果你wan't與其他一起使用的模式文件用相同名稱定義類型或元素的模式文件。它不會強制你在你想解組的xml文件中使用它。

另一方面,當您將對象綁定到XML時,文件package-info.java定義了JAXB使用的前綴,但是這隻適用於最新版本的JAXB,並且確保正確使用正確的版本並不總是很容易代碼運行。但是您可以使用NamespacePrefixMapper來控制它。