Можно ли обрабатывать значение как атрибут или элемент xml? - PullRequest
1 голос
/ 10 февраля 2012

Я реализую некоторые профили IHE ITI HL7, и есть доступная схема, из которой я сгенерировал классы JaxB. Недавно я обнаружил, что между различными версиями схемы есть некоторые различия. В частности, некоторые элементы XML теперь являются атрибутами XML.

Ранее атрибут typeCode был сопоставлен с элементом XML, см. Пример ниже:

 <acknowledgement>
    <typeCode code="AE"/>
</acknowledgement>

Теперь атрибут typecode сопоставлен с атрибутом XML, см. Пример ниже:

<acknowledgement typeCode="AE"/>

Есть ли способ, которым я могу иметь класс, использующий любые аннотации или другие возможности, которые могут обработать сообщение с типом, который входит в одну из этих форм? Еще лучше, есть ли способ заставить генератор XJC делать это для меня автоматически, возможно, с какой-то привязкой?

В настоящее время это просто поле с аннотацией @XmlAttribute.

1 Ответ

2 голосов
/ 10 февраля 2012

Если вы хотите немного испачкать руки, вы можете сделать это довольно просто, используя плагин XJC. В XJC есть плагин, который позволяет вам получать доступ к модельным классам по мере их создания с использованием Sun Codemodel API . Для начала нужно немного поспорить, но как только вы поймете основы, не составит труда сделать все виды полезных вещей во время генерации модели JAXB. Здесь есть хороший учебник .

Теперь, если у вас есть какая-то конфигурация, которая сообщает вам, какие элементы теперь являются атрибутами, я думаю, вы можете изменить класс модели так, чтобы он выглядел примерно так:

public class MyModel
{
  // this part is automatically generated by xjc
  @XmlAttribute
  public String foo;

  // you add this with your custom xjc plugin
  @XmlElement(name="foo")
  public String getFooElement() { return foo; }
  public void setFooElement(String newFoo) { foo = newFoo; }
}

На самом деле я не проверял эту теорию, но было бы довольно легко вручную изменить классы модели, чтобы увидеть, работает ли общая идея.

...