2012-04-29 3 views
4

Я использую JAXB для генерации XML-схемы из моих классов Java, чтобы другие разработчики могли легко создавать экземпляры классов без знания Java.Ошибка JAXB Schemagen и unmarshalling

Вот соответствующая часть кода:

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 { 
} 

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 Schema

<?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, но это нормально).

Проблема заключается в том, когда я пытаюсь маршализацию на единицу, я получаю сообщение об ошибке в одном из случаев

Case 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: model. Я не знаю, почему я получаю эту ошибку в случае 2, может кто-нибудь дать мне объяснение?

ответ

1

вам либо нужно удалить префикс tns из элемента модели, либо указать в вашей схеме значение «elementFormDefault» QUALIFIED (лично я предпочитаю это решение).

+0

Хотя теперь мне нужно установить каждый элемент для использования tns: (например, walkable), но это решение лучше, чем то, что я использовал. Вопрос: могу ли я установить все элементы, которые не имеют префикса для использования из пространства имен по умолчанию? Например, ввод или будет таким же, как и , и будет элементом/типом I, определенным как строка, а не ? – SHiRKiT

+1

@SHiRKiT - да, это стандартные правила xml, поэтому, если вы определяете 'xmlns =" ​​http://mygame.com "в корневом элементе, все не префиксные элементы будут в правильном пространстве имен. – jtahlborn