Разбор xStream одноуровневого XML - PullRequest
1 голос
/ 02 декабря 2011

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

<?xml version="1.0" encoding="utf-8"?>
<response status="426">
You can add 15 clients with your current plan. 
</response>

Этот xml представлен как POJO

public class ClientGenericResponse {
    String response;
    String status;
    ClientID client_id;

    public String getResponse() {
        return response;
    }

    public void setResponse(String response) {
        this.response = response;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public ClientID getClient_id() {
        return client_id;
    }

    public void setClient_id(ClientID clientId) {
        client_id = clientId;
    }

Используя этот код, я могу заставить XStream найти атрибут 'status', но не могу найти текстовое значение узла ответа.

    // Map response object
    xstream = new XStream(); 
    xstream.alias("response", ClientGenericResponse.class);

    xstream.useAttributeFor(ClientGenericResponse.class, "status");
    xstream.aliasField("status", ClientGenericResponse.class, "status");

    // Send request (this retrieves the xml above) 
    String xmlResponse = Utility.sendRequest(xml, true);

    ClientGenericResponse response = (ClientGenericResponse)xstream.fromXML(xmlResponse);

В этом случае объект ответа имеет заполненный статусно не текст.

Кажется довольно простым, и я могу заставить полностью перемещаться объекты вперед и назад, когда есть теги внутри корневого узла, но для этого случая с одним тегом я не могу получить содержимое.

Я вижу ссылки на "смешанный xml, не поддерживаемый", означает ли xml вверху "смешанный"?

1 Ответ

3 голосов
/ 02 декабря 2011

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

Это просточтобы сделать это, используя аннотации xstream, как показано ниже:

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;

@XStreamAlias("response")
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"response"})
public class ClientGenericResponse {

    String response;

    @XStreamAlias("type")
    String status;

    ClientID client_id;

    public String getResponse() {
        return response;
    }

    public void setResponse(String response) {
        this.response = response;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public ClientID getClient_id() {
        return client_id;
    }

    public void setClient_id(ClientID clientId) {
        client_id = clientId;
    }

    public static void main(String[] args) {

        XStream xstream = new XStream(); 
        xstream.processAnnotations(ClientGenericResponse.class);

        // Send request (this retrieves the xml above) 
        String xmlResponse = Utility.sendRequest(xml, true);

        ClientGenericResponse response = (ClientGenericResponse)xstream.fromXML(xmlResponse);
    }
}
...