微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – JAXB Schemagen和解组错误

我正在使用JAXB从我的Java生成XML Schema,这样其他开发人员就可以在没有Java知识的情况下轻松创建类的实例.

这是代码的相关部分:

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.class

@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 – 工作

鉴于这个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前缀,或者在模式中指定QUALIFIED的“elementFormDefault”值(个人而言,我更喜欢这个解决方案).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。