如何使用JAXB生成一个类,其元素可以包含字符串或XML?

时间:2014-08-13 15:01:10

标签: java xml jaxb moxy xjc

我正在使用JAXB从XML模式生成类。我的XML中有一个元素status,可能包含纯文本或XML(或两者)。例如,以下是所有有效内容:

<message>
  <status>OK</status>
</message>

<message>
  <status>
    <error>FAIL</error>
  </status>
</message>

<message>
  <status>
    There was an error<error>FAIL</error>
  </status>
</message>

按照上一个问题 - How to marshall a string using JAXB that sometimes contains XML content and sometimes does not? - 我可以使用DomHandler手动调整班级以成功编组和解组。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
  "status"
})
@XmlRootElement(name = "message")
public class Message
{
  @XmlAnyElement(StatusDomHandler.class)    
  protected String status;

  public String getStatus() { return status; }
  public void setStatus(String value) { this.status = value; }
}

问题是,我找不到让JAXB生成这个类的方法。如果我用

编写我的模式
<xsd:element name='status' type='xsd:string'/>

然后生成的类包含

@XmlElement(required = true)
protected String status;

我无法添加注释StatusDomHandler.class,因为@XmlElement不支持。

但是,如果我使用<xs:any>编写模式,则生成的类包含Element,它只能表示单个XML元素。

有什么方法可以强制JAXB创建一个字符串元素@XmlAnyElement?或者是否有其他方法可以定义我的模式以允许生成的元素包含文本或XML元素?

1 个答案:

答案 0 :(得分:3)

您可以指定您的类型具有混合内容,以获取您要查找的行为:

<xs:element name="message">
    <xs:complexType mixed="true">
        <xs:any/>
    </xs:complexType>
</xs:element>