我目前正在开发一个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
答案 0 :(得分:1)
首先,您最需要的是@XmlMixed
。你可能会有这样的结构:
@XmlMixed
@XmlElementRefs({
@XmlElementRef(name="ACTOR", type=JAXBElement.class),
...})
List<Object> content;
有了这个,您可以放置String
和JAXBElement<Actor>
来实现所谓的混合内容。
接下来,您可以考虑首先将DTD转换为XML Schema并进行编译 - 或者使用XJC编译DTD。
最后,你所拥有的是所谓的半结构化数据&#34;我认为它不太适合JAXB。 JAXB非常适合强大而清晰的结构,但是如果你有混合的东西,你就会得到难以使用的怪异模型。我不能提出替代方案。