JAXB Unmarshall одинаковые элементы с разными атрибутами (lang)

У меня есть XML-канал REST со следующим использованием языковой дифференциации

<name xml:lang="cs">Letní 2001/2002</name>
<name xml:lang="en">Summer 2001/2002</name>

Атрибут lang встречается с несколькими различными элементами, кроме name. Есть ли способ для меня легко разобрать это только с одним из элементов, основанных на выбранном языке? Или получить List или лучше Map их обоих?

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

редактировать: я еще не рассматривал МОКСИ, мне, вероятно, придется, если это не может быть сделано одним JAXB.

1 ответ

Решение

Примечание: я являюсь лидером EclipseLink JAXB (MOXy) и являюсь членом экспертной группы JAXB (JSR-222).

MOXy позволяет сопоставить элементу на основе значения атрибута XML, используя его @XmlPath расширение:

Модель Java (Foo)

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    @XmlPath("name[@xml:lang='cs']/text()")
    private String csName;

    @XmlPath("name[@xml:lang='en']/text()")
    private String enName;

}

демонстрация

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum17731167/input.xml");
        Foo foo = (Foo) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}

Для дополнительной информации

Другие вопросы по тегам