1

新手问题。我在问之前搜索过!我想对一些 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 包含一个跨度或文本,但不能同时包含两者)。

输出的种类是:

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

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

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

我可以发布数据,但实际上只有在绝对必要的情况下。我希望上述解释足以让某人友好地提供解决方案。

谢谢大家的帮助。

4

1 回答 1

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.class 用于跨度情况)。还请注意@XmlSeeAlso、@XmlMixed 和@XmlAnyElement。在某些情况下@XmlElementRef 和@XmlElementRefs 更适合。在我这里的情况下,使用@XmlAnyElement 可以毫不费力地工作。

对于更完整的讨论,我推荐 Blaise Doughan 在这篇文章中给出的答案:JAXB - Java/ XMLValue & XMLElement conflict

于 2013-04-16T18:11:55.887 回答