JAXB"如果一个类具有@XmlElement属性,则它不能具有@XmlValue属性."

Ale*_*exV 3 java xml jaxb xml-serialization

我正在尝试使用JAXB将XML定义为Java对象绑定.一切正常,当我试图除了罚款产生 XML像这样:

<request>
    Get Price
    <sessionId>read-only</sessionId>
</request>
Run Code Online (Sandbox Code Playgroud)

这样定义的类的对象:

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

我收到以下异常:

If a class has @XmlElement property, it cannot have @XmlValue property.
Run Code Online (Sandbox Code Playgroud)

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

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

你能帮忙吗?

bdo*_*han 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>
Run Code Online (Sandbox Code Playgroud)

这意味着文本节点可以与元素节点混合在一起.虽然转换样本文档的规则看似微不足道,但以下文档也是有效的,规则不太清楚.

<request>
    Get Price
    <sessionId>read-only</sessionId>
    More Text
</request>
Run Code Online (Sandbox Code Playgroud)

混合文本有其用途,但通常不赞成.首选方法是使用问题中描述的XML属性:

<request sessionId="read-only">Get Price</request>
Run Code Online (Sandbox Code Playgroud)

要查看JAXB如何处理混合文本,请参阅@XmlMixed注释: