10

私は次の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

5 に答える 5

13

残念ながら、ここで説明したMapperの動作をオーバーライドしても、暗黙のコレクションやアノテーションでは機能しません。バージョン1.4.3で確認しました。したがって、私が見つけた明らかな解決策は、注釈を省略して無視されたフィールドをモックすることでした。私には完璧に機能しますが、毎回作成するのは少し退屈です。

@XStreamOmitField
private Object ignoredElement;
于 2012-09-19T09:58:15.940 に答える
11

XStream 1.4.5以降、マーシャラー宣言中は、ignoreEnknownElements()メソッドを使用するだけで十分です。

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

不要な要素を無視します。

于 2014-07-17T12:00:26.757 に答える
1

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;
                        }
                    }
                };
            }
        };
于 2017-04-20T03:49:20.207 に答える
0

単純なグーグルは多くのioptionsを明らかにします。これはそれらの1つです:

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

于 2012-06-15T14:20:06.977 に答える
0

これを行うには、デフォルトのマーシャラーをオーバーライドします。

import org.springframework.oxm.xstream.XStreamMarshaller;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.mapper.MapperWrapper;

public class CustomXStreamMarshaller extends XStreamMarshaller {

@Override
protected XStream constructXStream() {
    // The referenced XStream constructor has been deprecated as of 1.4.5.
    // We're preserving this call for broader XStream 1.4.x compatibility.
    return new XStream() {
        @Override
        protected MapperWrapper wrapMapper(MapperWrapper next) {
                return new MapperWrapper(next) {
                    @Override
                    public boolean shouldSerializeMember(Class definedIn, String fieldName) {
                        if (definedIn == Object.class) {
                            return false;
                        }
                        return super.shouldSerializeMember(definedIn, fieldName);
                    }
                };
        }
    };
}}
于 2020-11-20T12:17:04.903 に答える