2016-09-18 165 views
0

XML:西河返回一个字符串,而不是对象(解组)

<FooBar> 
    <foo name="FooName"> 
     <bar .../> 
     <bar .../> 
    </foo> 
</FooBar> 

的Java:

class FooBar { 
    private Foo foo; 
} 

我寻找的是不要保存Foo对象FooBar而是添加Foo方式对象存储在静态映射中,并只存储类FooBar中的属性名称(FooName)。

换句话说,我想仅在需要时解析foo(未知名称)并将名称存储在FooBar中。

事情是这样的:

FooBar.java

class FooBar { 
    @XStreamConverter(FooConverter.class) 
    private String foo; 
} 

FooConverter.java

public class FooConverter extends ReflectionConverter { 

    public FooConverter(Mapper mapper, ReflectionProvider reflectionProvider) { 
     super(mapper, reflectionProvider); 
    } 

    @Override 
    public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext mc) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    @Override 
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext uc) { 
     String name = reader.getAttribute("name"); 
     Foo foo = FOOMAP.get(name); 

     if (foo != null) { 
      return name; 
     } 
     foo = (Foo) super.unmarshal(reader, uc); 
     FOOMAP.put(name, foo); 

     return name; 
    } 

    @Override 
    public boolean canConvert(Class type) { 
     return type == Foo.class || type == String.class; 
    } 

} 

目的是只解析一次foo标签,如果我们已经知道它(同名属性)并且能够做一种包含<foo name="FooName" />,因为“FooName”已经是已知的。

回答

0

ReflectionConverter有一个功能doUnmarshal和第一个参数是一个对象。

@Override 
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext uc) { 
    String name = reader.getAttribute("name"); 
    Foo foo = FOOMAP.get(name); 

    if (foo != null) { 
     return name; 
    } 

    foo = (Foo) super.doUnmarshal(new Foo(), reader, uc); 
    if(foo.getSomething() != null) // check if foo is not empty 
     FOOMAP.put(name, foo); 

    return name; 
} 

@Override 
public boolean canConvert(Class type) { 
    return type.equals(String.class); 
} 

这不是很好,但它的工作原理。

相关问题