2011-12-15 2 views
3

Я пытаюсь определить привязку привязки XML к Java с помощью JAXB. Все прекрасно работает, за исключением, когда я пытаюсь производить 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

+0

Blaise. Не могли бы вы объяснить использование аннотации @XmlMixed для достижения результата, описанного в вопросе? У меня есть те же самые требования. Я не контролирую, что такое выход, я просто должен его сопоставить. Сторонняя программа принимает XML в качестве входных данных, и формат смешивается, поэтому мои руки связаны ... –

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

_// btw, почему это константа? _> Я не хотел путать, это просто для иллюстративных целей. Благодаря! – AlexV

Смежные вопросы