Java XStream-как игнорировать некоторые элементы

у меня есть следующий XML-код:

<xml version="1.0" encoding="UTF-8"?> 
<osm version="0.6" generator="CGImap 0.0.2">
 <bounds minlat="48.1400000" minlon="11.5400000" maxlat="48.1450000" maxlon="11.5430000"/>
 <node id="398692" lat="48.1452196" lon="11.5414971" user="Peter14" uid="13832" visible="true" version="18" changeset="10762013" timestamp="2012-02-22T18:59:41Z">
 </node>
 <node id="1956100" lat="48.1434822" lon="11.5487963" user="Peter14" uid="13832" visible="true" version="41" changeset="10762013" timestamp="2012-02-22T18:59:39Z">
  <tag k="crossing" v="traffic_signals"/>
  <tag k="highway" v="traffic_signals"/>
  <tag k="TMC:cid_58:tabcd_1:Class" v="Point"/>
  <tag k="TMC:cid_58:tabcd_1:Direction" v="positive"/>
  <tag k="TMC:cid_58:tabcd_1:LCLversion" v="9.00"/>
  <tag k="TMC:cid_58:tabcd_1:LocationCode" v="35356"/>
  <tag k="TMC:cid_58:tabcd_1:NextLocationCode" v="35357"/>
  <tag k="TMC:cid_58:tabcd_1:PrevLocationCode" v="35355"/>
 </node>
</osm>

Я просто хочу сопоставить элементы (узел) с объектом, но у меня возникают проблемы:

  1. он жалуется на элементы границ, потому что я не хочу их сопоставлять.
  2. не все nodes есть tags поэтому у меня возникают некоторые проблемы с этим.

4 ответов


к сожалению, переопределение поведения Mapper, упомянутое здесь, не работает с неявными коллекциями или аннотациями. Я проверил версию 1.4.3. Поэтому очевидным решением, которое я нашел, было издеваться над игнорируемыми полями с аннотацией ommiting. Работает идеально подходит для меня, но немного скучно создавать их каждый раз.

@XStreamOmitField
private Object ignoredElement;

поскольку объявление xStream 1.4.5 durring marshaller достаточно использовать метод ignoreEnknownElements ():

XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.getXStream().ignoreUnknownElements();
...

игнорировать ненужные элементы.


просто определите ниже анонимный класс после замедления Xtream.

XStream xstream = new XStream(new DomDriver()){  
            protected MapperWrapper wrapMapper(MapperWrapper next) {
                return new MapperWrapper(next) {
                    public boolean shouldSerializeMember(Class definedIn, String fieldName) {
                        try {
                            return definedIn != Object.class || realClass(fieldName) != null;
                        } catch(CannotResolveClassException cnrce) {
                            return false;
                        }
                    }
                };
            }
        };

простой гуглить показывает много ioptions. Вот одна из них:--1-->

http://rafaelsteil.com/omit-unexpected-xml-elements-with-xstream/