2011-12-15 180 views
3

我想用JAXB定义XML到Java对象的绑定。一切工作正常,当我试图除了生产 XML像这样JAXB“如果一个类具有@XmlElement属性,则它不能拥有@XmlValue属性。”

<request> 
    Get Price 
    <sessionId>read-only</sessionId> 
</request> 

从类定义如下对象:

@XmlRootElement(name="request") 
public class Request { 

    @XmlValue 
    public String getCommandID() { return "Get Price"; }; 

    @XmlElement 
    public String getSessionID() { return "read-only"; }; 

} 

我收到以下异常:

If a class has @XmlElement property, it cannot have @XmlValue property. 

如果我将“sessionId”元素更改为属性,一切正常,但我当然希望它是一个元素。

我认为JAXB应该是非常灵活的,我相信我错过了一些明显的东西。

你能帮忙吗?

回答

5

类型,你正在寻找映射的XML文档的被称为具有“混合内容”。相应的XML模式如下所示:

<xs:element name="request"> 
    <xs:complexType mixed="true"> 
     <xs:sequence> 
      <xs:element name="sessionId" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

这意味着文本节点可以与元素节点混合显示。虽然转换示例文档的规则显得微不足道,但以下文档也是有效的,规则不太清晰。

<request> 
    Get Price 
    <sessionId>read-only</sessionId> 
    More Text 
</request> 

混合文字有它的用途,但是通常是不被赞同的。首选的方法是使用XML属性作为你的问题描述:

<request sessionId="read-only">Get Price</request> 

要了解JAXB如何处理混合文本看@XmlMixed注释:

+1

非常感谢你! 现在我希望JAXB,通常擅长于生成有意义的错误消息,可以在该消息中提及`@ XmlMixed`注释。 :)另一方面,我应该先阅读手册;-) – AlexV 2011-12-15 21:32:00

1

制作commandId元素还有什么不对吗?例如

<request> 
    <commandId>Get Price</commandId> 
    <sessionId>read-only</sessionId> 
</request> 

@XmlRootElement(name="request") 
public class Request { 

    @XmlElement 
    public String getCommandID() { return "Get Price"; }; 
    // btw, why's this a constant? 

    @XmlElement 
    public String getSessionID() { return "read-only"; }; 
    // and this too? 

} 
+0

_//顺便说一句,为什么这是一个常量?_>我不是想混淆,它只是为了说明的目的。谢谢! – AlexV 2011-12-15 21:39:11

相关问题