XStream анализируют атрибуты и значения одновременно

У меня есть следующий XML

<search ver="3.0">
    <loc id="ARBA0009" type="1">Buenos Aires, Argentina</loc>
    <loc id="BRXX1283" type="1">Buenos Aires, Brazil</loc>
    <loc id="ARDF0127" type="1">Aeroparque Buenos Aires, Argentina</loc>
    <loc id="MXJO0669" type="1">Concepcion De Buenos Aires, Mexico</loc>
    <loc id="MXPA1785" type="1">San Nicolas De Buenos Aires, Mexico</loc>
    <loc id="ARBA0005" type="1">Balcarce, Argentina</loc>
    <loc id="ARBA0008" type="1">Bragado, Argentina</loc>
    <loc id="ARBA0010" type="1">Campana, Argentina</loc>
    <loc id="ARBA0016" type="1">Chascomus, Argentina</loc>
    <loc id="ARBA0019" type="1">Chivilcoy, Argentina</loc>
</search>

И Городской класс

public class City {

    private String  id;
    private Integer type;
    private String  name;

    // getters & setters...
}

Я попробовал следующие псевдонимы для парсинга XML

xStream.alias("search", List.class);
xStream.alias("loc", City.class);
xStream.useAttributeFor("id", String.class);
xStream.useAttributeFor("type", Integer.class);

Но я не могу выяснить, как установить значение тега "местоположения", если я пытаюсь преобразовать Городской объект в XML, я добираюсь

<search>
    <loc id="ARBA0001" type="1">
        <name>Buenos Aires</name>
    </loc>
</search>

Когда я действительно должен получить это

<search>
    <loc id="ARBA0001" type="1">Buenos Aires</loc>
</search>

Затем если я пытаюсь проанализировать XML к Городскому объекту, что я получаю поле "имя" с нулевым значением.

Кто-либо знает, как установить te корректные псевдонимы, чтобы сделать это?Заранее спасибо.

6
задан Deduplicator 10 February 2015 в 22:38
поделиться

2 ответа

Я наконец нашел решение, это решает Конвертер, вот код

public class CityConverter implements Converter {

    public void marshal(Object value, HierarchicalStreamWriter writer, 
                                                               MarshallingContext context) {
        City city = (City) value;
        writer.addAttribute("id", city.getId());
        writer.addAttribute("type", city.getType().toString());
        writer.setValue(city.getName());
    }

    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        City city = new City();
        city.setName(reader.getValue());
        city.setId(reader.getAttribute("id"));
        city.setType(reader.getAttribute("type"));
        return city;
    }

    public boolean canConvert(Class clazz) {
        return clazz.equals(City.class);
    }

}

И в части установки псевдонимов я также установил CityConverter

xStream.registerConverter(new CityConverter());
xStream.alias("search", List.class);
xStream.alias("loc", City.class);

И все работает нормально :)

{{1 }}
9
ответ дан 8 December 2019 в 17:20
поделиться

XStream кажется сложным, вы можете сделать следующее в JAXB:

public class City { 

    @XmlAttribute private String  id; 
    @XmlAttribute private Integer type; 
    @XmlValue private String  name; 

    // getters & setters... 
}
1
ответ дан 8 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: