Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaXStream-如何忽略某些元素_Java_Xstream - Fatal编程技术网

JavaXStream-如何忽略某些元素

JavaXStream-如何忽略某些元素,java,xstream,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.5

我有以下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.4.3。 因此,我找到的一个明显的解决方案是用ommiting注释模拟被忽略的字段。对我来说很完美,但每次创作都有点无聊

    @XStreamOmitField
    private Object ignoredElement;
    

    由于XStream 1.4.5在marshaller声明期间使用IgnoreEnknowneElements()方法就足够了:


    忽略不必要的元素。

    只需在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;
                            }
                        }
                    };
                }
            };
    

    您可以通过覆盖默认封送拆收器来实现这一点

    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);
                        }
                    };
            }
        };
    }}
    

    好的,请显示您的xml,可能还有您正在设置xstreamOr的源代码,或者,您也可以这样做:
    xStream.omitField(ClassName.class,“fieldName”)
    
    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);
                        }
                    };
            }
        };
    }}