如何声明可以包含另一个元素或仅包含文本的元素

时间:2013-04-16 17:09:38

标签: java xml jaxb

新手问题。在询问之前我做了搜索!我想建模一些Java类,使得JAXB编组输出如下(基本上是HTML表数据 - XML):

   <td>
      <span class="myClass">assets</span>
   </td>
   <td>some text</td>
   <td>some more text</td>

基本上,让所有人都使用文本值非常容易。但是当我尝试包含上述跨度的规定(声明为单独的XMLElement)时,我无法自己获得“文本”。例如,它将文本包装在我声明要保存文本的String属性的名称中,或者如果我尝试通过使用@XmlValue将其关闭,那么它会抱怨您不能在同一声明中混合XMLElement和XMLValue(即使我只使用一个或另一个,具体取决于上面的上下文 - 每个td包含一个span或文本,但不能同时包含两个。)

输出的类型是:

<td><span class="myClass">assets</span></td><td><value>some text></value></td>

最终问题归结为“我如何删除那些”价值“元素?” 我想:

<td><span class="myClass">assets</span></td><td>some text</td>

我可以发布数据,但实际上只有绝对必要。我所希望的是上述解释对于某人提供解决方案就足够了。

谢谢大家的帮助。

1 个答案:

答案 0 :(得分:2)

好的,所以这里有答案。看起来很简单,但希望它能为其他人节省一小时的黑客攻击和搜索jaxb文档。执行以下操作 - 这里真正的问题是让TD成为多态的 - 在我的情况下我只想要一个跨度或纯文本值。没有两者的用例。

@XmlSeeAlso(Span.class)
@XmlRootElement(name = "td")
public class TableData {

private List<Object> items;

public TableData() {}

public TableData(List<Object> items) {
    this.items = items;
}

@XmlMixed
@XmlAnyElement
public List<Object> getItems() {
    return items;
}

public void setItems(List<Object> items) {
    this.items = items;
}

}

我有一个Span类(也单独声明为XMLElement。诀窍是放宽对值的类型的限制(不要尝试声明两个属性类型,一个字符串用于文本,一个Span) .xlass for span situation)。另请注意@XmlSeeAlso,@ XmlMixed和@XmlAnyElement。有些情况下@XmlElementRef和@XmlElementRefs会更适合。在我的情况下,使用@XmlAnyElement可以毫不费力地工作。

有关更完整的讨论,我建议Blaise Doughan在这篇文章中给出答案:JAXB - Java/ XMLValue & XMLElement conflict