zoukankan      html  css  js  c++  java
  • dom4j、Xstream、orika等类库简单使用

    最近用xml的数据格式比较多,所以简单记录一下这些类库的使用。

    dom4j

    dom4j用dom模型的方式解析xml数据。

    <!--依赖包-->
    <dependency>
                <groupId>org.dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>2.1.3</version>
            </dependency>
    
    
    
    <!--book.xml文件,后面使用-->
    <?xml version="1.0" encoding="utf-8"?>
    <bookstore>
    
        <book category="COOKING">
            <title lang="en">Everyday Italian</title>
            <author>Giada De Laurentiis</author>
            <year>2005</year>
            <price>30.00</price>
        </book>
    
        <book category="CHILDREN">
            <title lang="en">Harry Potter</title>
            <author>J K. Rowling</author>
            <year>2005</year>
            <price>29.99</price>
        </book>
    
        <book category="WEB">
            <title lang="en">XQuery Kick Start</title>
            <author>James McGovern</author>
            <author>Per Bothner</author>
            <author>Kurt Cagle</author>
            <author>James Linn</author>
            <author>Vaidyanathan Nagarajan</author>
            <year>2003</year>
            <price>49.99</price>
        </book>
    
        <book category="WEB">
            <title lang="en">Learning XML</title>
            <author>Erik T. Ray</author>
            <year>2003</year>
            <price>39.95</price>
        </book>
    
    </bookstore>
    
    
    
     @Test
        public void testDom4j() throws DocumentException, IOException {
    
            //获取文件对象
            File file=new File("book.xml");
            //创建解析器
            SAXReader reader = new SAXReader();
            //通过解析器获取文件内容,返回Document对象
            Document document = reader.read(file);
            //通过Document对象获取节点
            Element rootElement = document.getRootElement();
            //获取节点名
            System.out.println(rootElement.getName());
            //将节点对象转换为xml字符串
            System.out.println(rootElement.asXML());
    
        }
    

    Xstream

    Xstream通过反射,将JavaBean个xml进行互相转换,也可以进行JavaBean和Json数据之间的转换。

    <dependency>
                <groupId>com.thoughtworks.xstream</groupId>
                <artifactId>xstream</artifactId>
                <version>1.4.11.1</version>
            </dependency>
    
    <!-- 处理json转换时需要这个json处理包 -->
    <dependency>
        <groupId>org.codehaus.jettison</groupId>
        <artifactId>jettison</artifactId>
        <version>1.4.1</version>
    </dependency>
    
    

    xml和javaBean之间转换

    @Data
    @AllArgsConstructor
    public class User {
    
        private String name;
        private Integer id;
        private String sex;
        private Integer age;
    }
    
    @Data
    @AllArgsConstructor
    public class Person {
        private String name;
        private Integer id;
        private String sex;
    }
    
    @Test
    public  void testX(){
        //使用Stax不需要加入其他jar包做驱动
        XStream stream = new XStream(new StaxDriver());
    
        //给根节点起别名,默认是类名
        stream.alias("users",User.class);
        //给字段起别名
        stream.aliasField("姓名",User.class,"name");
    
        //将bean转换为xml格式
        String s = stream.toXML(new User("Jack",12666,"男",45));
        System.out.println(s);
        //从xml格式中获取对象
        System.out.println(stream.fromXML(s));
    
        //将bean以xml方式序列化到输出流中
        stream.toXML(new User("Jack",12666,"男",45),new FileWriter(new File("user.xml")));
    
    
    }
    
    
    <?xml version="1.0" ?><users><姓名>Jack</姓名><id>12666</id><sex>男</sex><age>45</age></users>
    Security framework of XStream not initialized, XStream is probably vulnerable.
    User(name=Jack, id=12666, sex=男, age=45)
    

    json和javabean之间转换,有两种驱动选择:

     //json驱动,自带的,只能写不能读
    XStream stream = new XStream(new JsonHierarchicalStreamDriver());
    stream.allowTypes(new Class[]{User.class});
    String xml = stream.toXML(new User("Jack", 12666, "男", 45));
    System.out.println(xml);
    
    //如其名字,分层显示
    {"com.cgl.ek.pojo.User": {
      "name": "Jack",
      "id": 12666,
      "sex": "男",
      "age": 45
    }}
    
    //内部实现一个方法,去掉根节点
    XStream streamJson = new XStream(new JsonHierarchicalStreamDriver(){
        public HierarchicalStreamWriter createWriter(Writer out) {
            return new JsonWriter(out, JsonWriter.DROP_ROOT_MODE);
        }
    });
    String xmlJson = streamJson.toXML(new User("Jack", 12666, "男", 45));
    System.out.println(xmlJson);
    
    //没有根节点
    {
      "name": "Jack",
      "id": 12666,
      "sex": "男",
      "age": 45
    }
    
    
     //从json字符串中还原对象,需要json包
    XStream jStream = new XStream(new JettisonMappedXmlDriver());
    Object o = jStream.fromXML(xml);
    String toXML = jStream.toXML(new User("Jack", 12666, "男", 45));
    System.out.println(toXML);
    
    {"com.cgl.ek.pojo.User":{"name":"Jack","id":12666,"sex":"男","age":45}}
    
    XStream jnStream = new XStream(new JettisonMappedXmlDriver());
    //jnStream.alias("user",User.class);
    jnStream.setMode(XStream.ID_REFERENCES);//这里可以设置模式
    String toXML2 = jnStream.toXML(new User("Jack", 12666, "男", 45));
    System.out.println(toXML2);
    
    //多出一个@ID字段
     {"com.cgl.ek.pojo.User":{"@id":1,"name":"Jack","id":12666,"sex":"男","age":45}}
    
    

    orika core

    这个库用来进行对象之间的拷贝,像BeanUtils,不同的是使用字节码生成数据。

     @Test
        public void testBean(){
            //获取映射工厂
            DefaultMapperFactory.Builder builder = new DefaultMapperFactory.Builder();
            DefaultMapperFactory factory = builder.build();
            //User中的数据拷贝到Person中,字段对应,剩下的用默认,最后注册
            factory.classMap(User.class, Person.class).field("name","name").byDefault().register();
            User u=new User("Jack",12666,"男",45);
            //映射装饰
            MapperFacade facade = factory.getMapperFacade();
            //开始拷贝
            Person person = facade.map(u, Person.class);
           
            System.out.println(person);
        }
    
    //没有的字段不会映射过去
    Person(name=Jack, id=12666, sex=男)
    
  • 相关阅读:
    OpenCV中的绘图函数
    整理不错的opencv博客
    opencv中的函数
    这是一个学习前端技术的网站
    HDU1520 Anniversary party(树形DP入门)
    CF1255C League of Leesins(图论)
    HDU4725 The Shortest Path in Nya Graph(最短路分层)
    1288C Two Arrays
    CF1294D MEX maxiszing
    CF1295C Obtain the String
  • 原文地址:https://www.cnblogs.com/cgl-dong/p/13829911.html
Copyright © 2011-2022 走看看