元素的 JAXB 多内容

JAXB Multiple Content for Element

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

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

我在我的文本中寻找的是这样的:

Prof. X clapped!

我想将其提取到我的 XML 中:

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

所以我基本上想要的是 ReactionClass 中的一个 String-Attribute,它作为 XML-Element 开发,但包含一个 Actor-Attribute + 文本的其余部分。我想到了类似的东西:

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 做同样的事情(如上所述),但是在创建新的 Class REACTION 时,我遇到了一些问题。喜欢:

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

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

谢谢马克斯

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

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

有了这个你可以放 Strings 和 JAXBElement<Actor> 来实现所谓的混合内容。

接下来,您可能会考虑先将 DTD 转换为 XML 模式并进行编译 - 或者使用 XJC 编译 DTD。

最后,您拥有的是所谓的 "semi-structured data",我认为它不太适合 JAXB。 JAXB 非常适合强大而清晰的结构,但如果你有混合的东西,你会得到难以使用的怪异模型。不过我不能建议其他选择。