демонтаж пустого элемента с одним атрибутом - PullRequest
2 голосов
/ 29 июля 2011
<animals>
    <dog name="Pluto"></dog>
</animals>

Если вы хотите удалить такой xml, мне нужно создать классы Animals и Dog.
Есть ли возможность создать только один класс?

public class Animals{
    private String dog; // value of this field should be "Pluto"
    private void setDog(String dog);
    private String getDog();
}

Как мне аннотировать методы в Animals?

Ответы [ 2 ]

1 голос
/ 29 июля 2011

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

Можно ли создать только один класс?

Да, это можно сделать несколькими способами:

  1. Использование XmlAdapter
  2. Использование расширения @XmlPath MOXy

Вариант 1 - XmlAdapter

Этот подход аналогичен тому, что было предложено только по skaffman он не позволяет логики модели вашего домена:

package forum6871469;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DogAdapter extends XmlAdapter<DogAdapter.Dog, String> {

    @Override
    public Dog marshal(String name) throws Exception {
        Dog dog = new Dog();
        dog.name = name;
        return dog;
    }

    @Override
    public String unmarshal(Dog dog) throws Exception {
        return dog.name;
    }

    public static class Dog {

        @XmlAttribute
        public String name;
    }

}

На ссылку XmlAdapter ссылается аннотация @XmlJavaTypeAdaper:

package forum6871469;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
public class Animals{
    private String dog; // value of this field should be "Pluto"

    @XmlJavaTypeAdapter(DogAdapter.class)
    public String getDog() {
       return dog;
    }

    public void setDog(String dogName) {
       dog = dogName;
    }

}

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

Вариант 2 - расширение @XmlPath MOXy

Вы можете использовать расширение @XmlPath в MOXy для сопоставления этого варианта использования:

package forum6871469;

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

@XmlRootElement
public class Animals{
    private String dog; // value of this field should be "Pluto"

    @XmlPath("dog/@name")
    public String getDog() {
       return dog;
    }

    public void setDog(String dogName) {
       dog = dogName;
    }

}

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

1 голос
/ 29 июля 2011

Нет, вам все еще понадобятся 2 класса, но вы можете скрыть класс Dog и выставить те же методы для вашего внешнего класса:

public class Animals{
    private @XmlElement Dog dog; 

    public void setDog(String dogName) {
       dog = new Dog();
       dog.name = dogName;
    }

    public String getDog() {
       return dog.name;
    }


    public static class Dog {
       private @XmlAttribute String name;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...