2016-03-14 3 views
1

В моем Android проекте, у меня есть два XML файлов, как эти:SimpleXML Java добавить класс как элемент

<request> 
    <target>www.facebook.com</target> 
    <packetsize>32</packetsize> 
    <timeout>4</timeout> 
    ... 
</request> 

и

<response> 
    <target>www.facebook.com</target> 
    <packetsize>32</packetsize> 
    <timeout>4</timeout> 
    ... 
</request> 

Оба файла имеют одни и те же элементы, но разные корневые узлы. Используя структуру SimpleXML, я хочу создать новый класс PinResponse как контейнер для всех элементов из XML-файлов для повторного использования/изменения атрибутов ответа. Для этого я хочу ссылаться на класс в моих классах модели XML как на элемент.

класс

PinResponse:

@Element 
public class PinResponse { 

    @Element(name = "target") 
    private String target; 

    @Element(name = "packetsize") 
    private int packetSize; 

    @Element(name = "timeout") 
    private int timeout; 

    ... 
} 

класс XML Модель:

@Root(name = "request") 
public class PingResponseData { 

    @Element 
    private PinResponse pinResponse; 

    public PinResponse getPinResponse() { 
     return pinResponse; 
    } 
} 

, но я всегда получаю ElementException:

org.simpleframework.xml.core.ElementException: Element 'target' does not have a match in class 

Как я могу добавить класс PinResponse как элемент в мой Классы моделей XML?

ответ

1

Kris Ларсоны answer помог мне решить мою проблему, это как мое окончательное решение выглядит сейчас:

Базовый класс: (защищенный доступ использовать элементы подкласса)

public abstract class Ping { 

    @Element(name = "target") 
    protected String target; 

    @Element(name = "packetsize") 
    protected int packetSize; 

    @Element(name = "timeout") 
    protected int timeout; 

    ...(getter/setter) 
} 

запроса подкласс:

@Root(name = "request") 
public class PingRequest extends PingRequestResponse { 

    public PingRequest(Ping ping) { 
      this.target = ping.getTarget(); 
      this.packetsize = ping.getPacketsize(); 
      this.timeout = ping.getTimeout(); 
      ... 
} 

подкласс Ответ:

@Root(name = "response") 
public class PingResponse extends PingRequestResponse { 
      //empty as it has the same elements, if it would have additional fields, they would be added here 
} 
2

Обычно путь вы могли бы сделать это было бы что-то вроде этого:

public abstract class PingRequestResponse { 

    @Element(name = "target") 
    private String target; 

    @Element(name = "packetsize") 
    private int packetSize; 

    @Element(name = "timeout") 
    private int timeout; 

    ... 
} 

@Root(name = "request") 
public class PingRequest extends PingRequestResponse { } 

@Root(name = "response") 
public class PingResponse extends PingRequestResponse { } 

Однако, я не работал с достаточно SimpleXML, чтобы знать, если аннотации будут корректно работать в подклассах, как это.

Попробуйте и посмотрите, что произойдет.

+0

Спасибо за ваш ответ, я попробую! – Eve

Смежные вопросы