2012-04-29 50 views
4

我正在使用JAXB從我的Java類生成一個XML Schema,因此其他開發人員可以輕鬆創建這些類的實例,而無需Java中的知識。JAXB Schemagen和反編組錯誤

下面的代碼的相關部分:

package-info.java

@XmlSchema(xmlns = @XmlNs(prefix = "p", namespaceURI = "http://mygame.com"), 
      namespace = "http://mygame.com") 

package com.mygame.entity.properties; 

import javax.xml.bind.annotation.XmlNs; 
import javax.xml.bind.annotation.XmlSchema; 

Model.class

package com.mygame.entity.properties; 

@XmlType(name = "model", namespace = "http://mygame.com") 
@XmlRootElement(name = "model", namespace = "http://mygame.com") 
public class Model { 

    @XmlAttribute(required = true) 
    public String path; 

    public Model() { 
    } 
} 

Unit.class

@XmlType(name="unit", namespace="http://mygame.com") 
@XmlRootElement(name="unit", namespace="http://mygame.com") 
public class Unit extends GameObject { 
} 

遊戲對象。

@XmlType(name = "gameobject", namespace = "http://mygame.com") 
public abstract class GameObject extends Thing { 

    // Attributes 
    public Armor armor; 
    public Short maxHp; 
    public Boolean walkable = false; 
    public AbstractModel model; 
} 

Thing.class

@XmlType(name="thing", namespace="http://mygame.com") 
public abstract class Thing { 
    // Constants 
    // Attributes 

    @XmlElement(required=false) 
    public String icon; 
} 

生成的XML架構

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xs:schema version="1.0" targetNamespace="http://mygame.com" xmlns:e="http://mygame.com" xmlns:s="http://mygame.com" xmlns:tns="http://mygame.com" xmlns:p="http://mygame.com" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 


    <xs:element name="model" type="tns:model"/> 

    <xs:element name="unit" type="tns:unit"/> 

    <xs:complexType name="thing" abstract="true"> 
    <xs:sequence> 
     <xs:element name="icon" type="xs:string" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="unit"> 
    <xs:complexContent> 
     <xs:extension base="tns:gameobject"> 
     <xs:sequence/> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="gameobject" abstract="true"> 
    <xs:complexContent> 
     <xs:extension base="tns:thing"> 
     <xs:sequence> 
      <xs:element ref="tns:armor" minOccurs="0"/> 
      <xs:element name="maxHp" type="xs:short" minOccurs="0"/> 
      <xs:element name="walkable" type="xs:boolean" minOccurs="0"/> 
      <xs:element ref="tns:model" minOccurs="0"/> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="model"> 
    <xs:sequence/> 
    <xs:attribute name="path" type="xs:string" use="required"/> 
    </xs:complexType> 


</xs:schema> 

到目前爲止,一切都很好。它正確地生成了一個想要的XML(儘管有那些煩人的TNS前綴,但這很好)。

問題是,當我試圖來解讀一個單位,我在的情況下

案例1一個得到一個錯誤 - 工作

鑑於這種XML輸入,一切工作正常,我也得到一個我班的實例正確。

<?xml version="1.0" encoding="UTF-8"?><tns:unit xmlns:tns="http://mygame.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="/home/shirkit/jMonkeyProjects/Fortress Wars/Core/schema/full.xsd"> 
<maxHp>100</maxHp> 
<walkable>false</walkable> 
<model path="Models/Oto/Oto.mesh.xml"/></tns:unit> 

案例2 - 不工作

鑑於此,我得到下面

<?xml version="1.0" encoding="UTF-8"?><tns:unit xmlns:tns="http://mygame.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="/home/shirkit/jMonkeyProjects/Fortress Wars/Core/schema/full.xsd"> 
<maxHp>100</maxHp> 
<walkable>false</walkable> 
<tns:model path="Models/Oto/Oto.mesh.xml"/></tns:unit> 


unexpected element (uri:"http://mygame.com", local:"model"). Expected elements are <{}icon>,<{}model>,<{}walkable>,<{}armor>,<{}maxHp> 

描述錯誤的兩個XML輸入之間的唯一區別是,一個有元模型,以及其他有元素tns:模型。我不知道爲什麼我在案例2中得到這個錯誤,有人可以給我一個解釋嗎?

回答

1

您或者需要從模型元素中刪除tns前綴,或者在模式中指定QUALIFIED的「elementFormDefault」值(我個人更喜歡此解決方案)。

+0

儘管現在我需要設置每個元素來使用tns :(如walkable),但是這個解決方案比我使用的更好。一個問題:我可以如何設置所有沒有前綴的元素從默認命名空間使用?例如,輸入將是相同的,就像將是一個元素/類型我定義爲字符串,而不是? – SHiRKiT

+1

@SHiRKiT - 是的,這是標準的xml規則,所以如果你在根元素中定義了'xmlns =「http://mygame.com」',那麼所有沒有前綴的元素都將位於正確的名稱空間中。 – jtahlborn