JAXB: элемент с текстовым содержимым и атрибутами, генерирующий классы с XJC.

Недавно я столкнулся с проблемой, которая кажется очень распространенной: как представить XML-элемент с атрибутами и простым текстовым содержимым, например:

<elem attr="aval">elemval</elem>

с помощью JAXB.

Я нашел много советов, как это сделать, но каждый из этих советов предполагает ручное редактирование классов привязки.

У меня есть набор схем, и я использую XJC для преобразования этих схем в классы Java. Однако кажется, что он выдает неверный код, т.е. не генерирует методы для установки простого содержимого, есть методы только для установки атрибутов.

Можно ли исправить такое поведение XJC? Обширное гугление не помогло в этом вопросе.


person Vladimir Matveev    schedule 12.10.2012    source источник


Ответы (1)


Ниже приведена схема XML, которая определяет структуру XML для вашего варианта использования.

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/schema"
    xmlns:tns="http://www.example.org/schema" elementFormDefault="qualified">

    <element name="elem">
        <complexType>
            <simpleContent>
                <extension base="string">
                    <attribute name="attr" type="string" />
                </extension>
            </simpleContent>
        </complexType>
    </element>

</schema>

Генерация модели JAXB из этой XML-схемы приведет к следующему классу:

package forum12859885;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "value"
})
@XmlRootElement(name = "elem")
public class Elem {

    @XmlValue
    protected String value;
    @XmlAttribute(name = "attr")
    protected String attr;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getAttr() {
        return attr;
    }

    public void setAttr(String value) {
        this.attr = value;
    }

}
person bdoughan    schedule 12.10.2012
comment
Это очень странно. У меня точно такая же схема вплоть до префикса пространства имен, и я уверен, что XJC сгенерировал класс без методов getValue и setValue... Я проверил это сейчас на своем собственном компьютере, и это сработало успешно. Через два дня попробую еще раз, может что-то пропустил. Большое спасибо. - person Vladimir Matveev; 12.10.2012
comment
Да, это была моя вина. Только что проверил мою схему, на самом деле она имела complexContent вместо simpleContent внутри спецификации complexType. Кажется, это была проблема; изменил его на simpleContent, и это сработало как шарм. Еще раз спасибо, я приму ваш ответ. - person Vladimir Matveev; 15.10.2012