JAXB元素的多个内容

时间:2015-01-30 17:00:18

标签: java xml jaxb xml-dtd

我目前正在开发一个txt-to-xml项目。基本上我正在做的是为某些内容创建不同的XmlElements。 我启动并运行了DTD,现在我创建了一个默认的xml,只是为了确保每个创建的xml都是一个有效的xml(对于给定的DTD)。 我主要为每个元素创建新的类,它没有#PCDATA结构,到目前为止它工作得非常好。 现在我正在努力解决问题: 我的DTD中有以下内容:

<!ELEMENT REACTION(#PCDATA | ACTOR*)>

我在文本中寻找的内容如下:

  

教授。 X鼓掌!

我希望将其提取到我的XML中:

<REACTION>
  <ACTOR>Prof. X</ACTOR> clapped!
</REACTION>

所以我基本上想要的是ReactionClass中的String-Attribute,它作为XML-Element devlares但是拥有Actor-Attribute + Text的其余部分。我想到了类似的东西:

String m_sText;
String m_sActor;

public ReactionClass(){ 
 this.Actor = "Prof. X";
 this.sText = this.m_sActor + " clapped!";
}

@XmlElement(name = "TEXT")
public String getM_sText(){ return this.m_sText; }

@XmlElement(name = "ACTOR")
public String getM_sActor(){ return this.m_sActor; }

对于所有其他节点,例如RootNode,我创建了一个RootNodeClass,它包含不同的属性,例如m_nLocation,m_nTime,m_nYear,它们被声明为XML-Elements,因此JAXB-Marshaller只是根据这些属性构建XML元素:

<ROOT>
 <TIME>09:00</TIME>
 <LOCATION>New York</TIME>
 <YEAR>1992</YEAR>
</ROOT>

我想对REACTION-Node(如上所述)做同样的事情,但是当创建一个新的类REACTION时,我得到了......像:

<REACTION>
  <TEXT>Prof. X clapped!</TEXT>
  <ACTOR>Prof. X</ACTOR>
</REACTION>

我如何将它们放入一个元素但仍然保留上面的标签? 如果有人知道如何管理这个我会非常感激!

谢谢Max

1 个答案:

答案 0 :(得分:1)

首先,您最需要的是@XmlMixed。你可能会有这样的结构:

@XmlMixed
@XmlElementRefs({
    @XmlElementRef(name="ACTOR", type=JAXBElement.class),
    ...})
List<Object> content;

有了这个,您可以放置​​StringJAXBElement<Actor>来实现所谓的混合内容。

接下来,您可以考虑首先将DTD转换为XML Schema并进行编译 - 或者使用XJC编译DTD。

最后,你所拥有的是所谓的半结构化数据&#34;我认为它不太适合JAXB。 JAXB非常适合强大而清晰的结构,但是如果你有混合的东西,你就会得到难以使用的怪异模型。我不能提出替代方案。