【问题标题】:How to generate a class using JAXB whose element can contain a string or XML?如何使用 JAXB 生成一个类,其元素可以包含字符串或 XML?
【发布时间】:2014-10-07 00:23:54
【问题描述】:

我正在使用 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 不支持它。

但如果我使用 &lt;xs:any&gt; 编写架构,则生成的类包含一个只能表示单个 XML 元素的 Element

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

【问题讨论】:

    标签: java xml jaxb moxy xjc


    【解决方案1】:

    您可以指定您的类型具有混合内容以获得您正在寻找的行为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多