XStream 解析xml 转 javaBean 问题

   xstream解析后获取不到属性值的问题解决办法2种:
方法一:属性值在类中指定 
  xstream.useAttributeFor(ChildNav.class, "name");
  xstream.useAttributeFor(ChildNav.class, "url");
方法二,通过方法处理:
    /**
     *@author
     * ChildNav属性值转换器 
     */
//    public class ChildNavConverter implements Converter {
//
//        public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
//            ChildNav childNav = (ChildNav) value;
//            writer.addAttribute("name", childNav.getName());
//            writer.addAttribute("url", childNav.getUrl());
//        }
//
//        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
//            ChildNav childNav = new ChildNav();
            city.setName(reader.getValue());
//            childNav.setName(reader.getAttribute("name"));
//            childNav.setUrl(reader.getAttribute("url"));
//            return childNav;
//        }
//
//        public boolean canConvert(Class clazz) {
//            return clazz.equals(ChildNav.class);
//        }
//
//    }

调用方法:  //         xstream.registerConverter(new ChildNavConverter());
/*******************************************************************************************************************/
详细代码解析:
         XStream xstream = new XStream();
         File xml = new File(fileName);
         BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(xml), "UTF-8"));
         //xml文档中节点映射到对应的类
         xstream.alias("childNav", ChildNav.class);
         xstream.alias("nav", Nav.class);
         xstream.alias("permissions", Permissions.class);
         //xml 文档属性值与对象属性值的对应。(这里可以映射别名)
         xstream.aliasField("name", Nav.class, "name"); 
         xstream.aliasField("name", ChildNav.class, "name"); 
         xstream.aliasField("url", ChildNav.class, "url"); 

         //声明对象中的属性值是xml文档中对应的属性而不是节点(不加这个可能会造成解析后的对象属性的值是null)
         xstream.useAttributeFor(ChildNav.class, "name");
         xstream.useAttributeFor(ChildNav.class, "url");
         xstream.useAttributeFor(Nav.class, "name");
         //父节点nav对应Nav类,childNav节点对应ChildNav类,有多个childNav节点,这里需转换到集合中
//没有这句的话会报错误“ Caused by: //com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: //Duplicate field childNav
         xstream.addImplicitCollection(ChildNav.class, "childNav");
//将一个xml转成java对象
         Permissions Obj = (Permissions)xstream.fromXML(reader); // deserialize from XML

//对xml的package包进行别名映射
xstream.aliasPackage("my.company", "com.thoughtworks"); 

XStream提供了Converter,使我们在object<->xml时,能对一些输入输出参数进行类型转换。

默认的情况下,XStream在做转换时,会将整个object转成xml,也会将整个xml转成对象。 
对于个别字段或者xml域,可能我们不想做转换,就可以使用omitField 。
xStream.omitField(Person.class, "lastname");
(不会吧Person类里面的属性lastname 解析到xml)

默认情况下,XStream不会自动扫描这种Annotations
stream.processAnnotations(RendezvousMessage.class);(需要加上这句去扫描RendezvousMessage.class里面的注释)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值