2012-04-29 19 views
4

私はJavaクラスからXMLスキーマを生成するためにJAXBを使用しているので、他の開発者はJavaの知識なしで簡単にクラスのインスタンスを作成できます。JAXBスキーマとアンマーシャリングエラー

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接頭辞を使用していますが、それは問題ありません)。

問題は、私はUNITをアンマーシャリングしようとすると、私は

ケース1例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から

を動作していないが、これを考えると、私は2つのXML入力の唯一の違いは、1要素モデルを持っていることである、と

<?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> 

下記のエラーが出ますotherには要素tns:modelがあります。私はなぜこのエラーがケース2で起こっているのかわからない、誰かがそれについて私に説明を与えることができますか?

答えて

1

モデル要素からtns接頭辞を削除するか、スキーマで "elementFormDefault"という値をQUALIFIED(個人的には私はこの解決策が望ましい)と指定する必要があります。

+0

今、私はtnsを使うためにすべての要素を設定する必要がありますが(walkableのように)、このソリューションは私が使っていたものより優れています。質問:接頭辞を持たないすべての要素がデフォルトの名前空間から使用できるように設定することはできますか?たとえば、またはと入力すると、のように、文字列として定義された要素/タイプIとなりますが、ではなく、 – SHiRKiT

+1

@SHiRKiT - はい、これは標準のXMLルールですので、ルート要素に 'xmlns =" http://mygame.com "を定義すると、接頭辞のない要素はすべて正しい名前空間に入ります。 – jtahlborn

関連する問題