我有一个类似于下面的XML
结构。我有用来写每个对象A
、B
和C
的转换器。在XStream
中是否可以检查a节点是否存在于XML层次结构中?也就是说,在下面的例子中,在我写C
之前,我想做一些如果B
节点存在的事情。
<A>
<B>
<C>
</C>
</B>
</A>
发布于 2019-02-09 18:32:16
如果我理解正确的话,您想在CConverter
中检查层次结构中是否已经存在B
节点。如果结构和上面一样,那么总是true
。编组过程从根对象开始,进入内部属性。因此,要写入C
节点,首先必须存在B
。
假设您有如下所示的简单POJO
结构:
class A {
public B b = new B();
}
class B {
public C c = new C();
}
class C {
}
现在,我们可以实现A
和B
的转换器了
class AConverter implements Converter {
public boolean canConvert(Class clazz) {
return clazz.equals(A.class);
}
public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
System.out.println("Marshalling A!");
A a = (A) value;
if (a.b != null) {
writer.startNode("B");
context.convertAnother(a.b);
writer.endNode();
}
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
throw new NotImplementedException();
}
}
class BConverter implements Converter {
public boolean canConvert(Class clazz) {
return clazz.equals(B.class);
}
public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
System.out.println("Marshalling B!");
B b = (B) value;
if (b.c != null) {
writer.startNode("C");
context.convertAnother(b.c);
writer.endNode();
}
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
throw new NotImplementedException();
}
}
Main
类:
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
public class XStreamApp {
public static void main(String[] args) {
XStream xStream = new XStream();
xStream.registerConverter(new AConverter());
xStream.registerConverter(new BConverter());
xStream.alias("A", A.class);
System.out.println(xStream.toXML(new A()));
}
}
打印:
Marshalling A!
Marshalling B!
<A>
<B>
<C/>
</B>
</A>
https://stackoverflow.com/questions/54526294
复制相似问题