XSD любой тип и JAXB - PullRequest
       2

XSD любой тип и JAXB

3 голосов
/ 15 августа 2010

У меня есть определение xsd (с www.tmforum.org ossj common api v1.5)

<element name="primaryKey" nillable="false">
   <complexType mixed="false">                   
      <complexContent mixed="false">
         <extension base="anyType"/>                   
      </complexContent>
   </complexType>
</element>

, и я хотел бы сгенерировать xml следующим образом

<ossj-co-v1-5:primaryKey>mykey</ossj-co-v1-5:primaryKey>

Класс PrimaryKey, сгенерированный из xsd с использованием xjc, требует, чтобы элемент DOM был сохранен в списке (см. Сгенерированный класс PrimaryKey внизу "." MyKey "здесь представляет собой TextNode и, поскольку он не является элементом DOM, его нельзя добавить в xjcсгенерированный класс PrimaryKey. Как мне получить необходимые выходные данные?

Вот класс PrimaryKey, сгенерированный из xsd

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
    "any"
    })
public static class PrimaryKey {

    @XmlAnyElement
    protected List<Element> any;
    @XmlAnyAttribute
    private Map<QName, String> otherAttributes = new HashMap<QName, String>();

    public List<Element> getAny() {
        if (any == null) {
            any = new ArrayList<Element>();
        }
        return this.any;
    }


    public Map<QName, String> getOtherAttributes() {
        return otherAttributes;
    }

}

Ответы [ 2 ]

3 голосов
/ 17 августа 2010

Следующие объектные модели подойдут для вашего сценария. Я попытаюсь выкопать настройки подходящей схемы для создания этих объектных моделей.

Вариант № 1

Ваш код может выглядеть следующим образом. Это будет означать, что элемент «primaryKey» приведет к созданию экземпляра объекта PrimaryKey с соответствующим текстовым содержимым, установленным для свойства any.

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = {"any" }) 
public static class PrimaryKey { 

    @XmlValue
    protected String any; 

    @XmlAnyAttribute 
    private Map<QName, String> otherAttributes = new HashMap<QName, String>(); 

    public List<Element> getAny() { 
        if (any == null) { 
            any = new ArrayList<Element>(); 
        } 
        return this.any; 
    } 


    public Map<QName, String> getOtherAttributes() { 
        return otherAttributes; 
    } 

} 

Вариант № 2

Если вы хотите, чтобы внешний объект имел свойство String, соответствующее primaryKey, вы можете сделать следующее:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Root {

    // @XmlElement is implied
    private String primaryKey;

}
1 голос
/ 26 сентября 2011

Опция # 1 getAny () не может возвращать строку, поскольку подпись возвращает список.

Опция 2 действительно работает . Спасибо!

Вот как выглядит моя модификация кода OSSJ:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ManagedEntityKey", propOrder = {
    "applicationContext",
    "applicationDN",
    "type",
    "primaryKey"
})
public class ManagedEntityKey {
   @XmlElement(required = true)
   protected String primaryKey;
   //protected ManagedEntityKey.PrimaryKey primaryKey;

И, конечно же, подпись установщиков и получателей должна быть изменена.

...