Я использую 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, может кто-нибудь дать мне объяснение?
Хотя теперь мне нужно установить каждый элемент для использования tns: (например, walkable), но это решение лучше, чем то, что я использовал. Вопрос: могу ли я установить все элементы, которые не имеют префикса для использования из пространства имен по умолчанию? Например, ввод или будет таким же, как и , и будет элементом/типом I, определенным как строка, а не ? –
SHiRKiT
@SHiRKiT - да, это стандартные правила xml, поэтому, если вы определяете 'xmlns =" http://mygame.com "в корневом элементе, все не префиксные элементы будут в правильном пространстве имен. – jtahlborn