首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查看XStream接口中是否存在节点

查看XStream接口中是否存在节点
EN

Stack Overflow用户
提问于 2019-02-05 08:31:10
回答 1查看 194关注 0票数 7

我有一个类似于下面的XML结构。我有用来写每个对象ABC的转换器。在XStream中是否可以检查a节点是否存在于XML层次结构中?也就是说,在下面的例子中,在我写C之前,我想做一些如果B节点存在的事情。

代码语言:javascript
运行
复制
<A>
    <B>
        <C>
        </C>
    </B>
</A>    
EN

回答 1

Stack Overflow用户

发布于 2019-02-09 18:32:16

如果我理解正确的话,您想在CConverter中检查层次结构中是否已经存在B节点。如果结构和上面一样,那么总是true。编组过程从根对象开始,进入内部属性。因此,要写入C节点,首先必须存在B

假设您有如下所示的简单POJO结构:

代码语言:javascript
运行
复制
class A {
    public B b = new B();
}

class B {
    public C c = new C();
}

class C {

}

现在,我们可以实现AB的转换器了

代码语言:javascript
运行
复制
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类:

代码语言:javascript
运行
复制
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()));
    }
}

打印:

代码语言:javascript
运行
复制
Marshalling A!
Marshalling B!
<A>
  <B>
    <C/>
  </B>
</A>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54526294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档