元素的 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;
有了这个你可以放 String
s 和 JAXBElement<Actor>
来实现所谓的混合内容。
接下来,您可能会考虑先将 DTD 转换为 XML 模式并进行编译 - 或者使用 XJC 编译 DTD。
最后,您拥有的是所谓的 "semi-structured data",我认为它不太适合 JAXB。 JAXB 非常适合强大而清晰的结构,但如果你有混合的东西,你会得到难以使用的怪异模型。不过我不能建议其他选择。
我目前正在从事 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;
有了这个你可以放 String
s 和 JAXBElement<Actor>
来实现所谓的混合内容。
接下来,您可能会考虑先将 DTD 转换为 XML 模式并进行编译 - 或者使用 XJC 编译 DTD。
最后,您拥有的是所谓的 "semi-structured data",我认为它不太适合 JAXB。 JAXB 非常适合强大而清晰的结构,但如果你有混合的东西,你会得到难以使用的怪异模型。不过我不能建议其他选择。