zoukankan      html  css  js  c++  java
  • JAVA对象和XML文档、原来他们之间还有这一出

       最近项目开发中遇到一个问题,访问接口不再通过url地址请求的方式,而是

    通过socket发送xml格式的报文到指定服务器来进行信息的统一认证。。

    因此组装xml格式的报文字符串以及解析服务器返回的xml格式的字符获得所需数据成了

    解决问题的关键。。在这之前,以为会有点难。。。做完之后,然并卵,也就那么一回事。。。

      LZ主要用的xStream类。。这个类的完美地解决了XML文档和JAVA对象之间的转换。。

     由于刚刚接触这个类。。。对于里面提供的很多功能还没细细挖掘。。只是简单地实现了

    我想要实现的功能。。待后续有时间再细嚼慢咽、细细品味。。。

    Entrance类:主要提供程序运行的入口。。。

          该类中包含了一个静态的generateHtml()方法、用于生成XML格式的字符串

    package com.linjm.xml;
    
    public class Entrance {
    
        public static void main(String[] args) {
            
            String html = generateHtml();
            
            System.out.println("############################");
            
            TagEntity tagEntity = XMLUtil.fromXml(html, TagEntity.class);
            
            System.out.println("解析HTML:");
            System.out.println("title:" + tagEntity.getHead().getTitle());
            
            System.out.println("输出类信息:");
            System.out.println(tagEntity.toString());
        }
        
        
        public static String generateHtml() {
            TagEntity tagEntity = new TagEntity();
            
            Head head = Init.initHead();
            Body body = Init.initBody();
            
            tagEntity.setHead(head);
            tagEntity.setBody(body);
            
            String html = XMLUtil.toXml(tagEntity);
            
            String top = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    ";
            
            System.out.println("生成HTML:
    " + top + html);
            
            return html;
        }
        
    }
    View Code

    先看下程序的运行结果吧。。。看完我们再看后面具体的代码结构。。。

    生成HTML:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>Title</title>
        <meta>Meta</meta>
        <js>JavaScript</js>
        <css>CSS</css>
      </head>
      <body>
        <div>Div</div>
        <span>Span</span>
        <font>Front</font>
        <input>Input</input>
      </body>
    </html>
    ############################
    解析HTML:
    title:Title
    输出类信息:
    head:[title:Title,meta:Meta,js:JavaScript,css:CSS],body:[div:Div,input:Input,font:Front,span:Span]
    View Code

    Init类:主要用于初始化XML中的Head和Body标签内的子标签内容。。。    

    package com.linjm.xml;
    
    public class Init {
    
        public static Head initHead() {
            Head head = new Head();
    
            head.setTitle("Title");
            head.setMeta("Meta");
            head.setJs("JavaScript");
            head.setCss("CSS");
    
            return head;
        }
    
        public static Body initBody() {
            Body body = new Body();
    
            body.setDiv("Div");
            body.setFont("Front");
            body.setInput("Input");
            body.setSpan("Span");
    
            return body;
        }
    
    }
    View Code

    TagEntity类:主要是包含了两个字段:head和body。

           也是最终xml中呈现的head标签和body标签。。。

            通过@XStreamAlias注解的方式定义标签中的xml显示内容。。。

           大家可以根据自己的需求定义不同的标签。。。

             head和body标签可根据需求不同而不同。。。

    package com.linjm.xml;
    
    import com.thoughtworks.xstream.annotations.XStreamAlias;
    
    @XStreamAlias("html")
    public class TagEntity {
        @XStreamAlias("head")
        private Head head;
        
        @XStreamAlias("body")
        private Body body;
    
        public Head getHead() {
            return head;
        }
    
        public void setHead(Head head) {
            this.head = head;
        }
    
        public Body getBody() {
            return body;
        }
    
        public void setBody(Body body) {
            this.body = body;
        }
        
        public String toString() {
            String str = "head:[" +
                                "title:"+ head.getTitle() + 
                                ",meta:"+ head.getMeta() +
                                ",js:"+ head.getJs() +
                                ",css:"+ head.getCss() +
                            "]," +
                            "body:[" +
                                "div:"+ body.getDiv() + 
                                ",input:"+ body.getInput() +
                                ",font:"+ body.getFont() +
                                ",span:"+ body.getSpan() +
                            "]";
            return str;
        }
    
    }
    View Code

    Head类:该实体类中定义了head标签中的子标签属性字段。。 。

          head标签中的子标签可依据具体实际情况而定

    package com.linjm.xml;
    
    import com.thoughtworks.xstream.annotations.XStreamAlias;
    
    public class Head {
    
        @XStreamAlias("title")
        private String title;
        
        @XStreamAlias("meta")
        private String meta;
        
        @XStreamAlias("js")
        private String js;
        
        @XStreamAlias("css")
        private String css;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getMeta() {
            return meta;
        }
    
        public void setMeta(String meta) {
            this.meta = meta;
        }
    
        public String getJs() {
            return js;
        }
    
        public void setJs(String js) {
            this.js = js;
        }
    
        public String getCss() {
            return css;
        }
    
        public void setCss(String css) {
            this.css = css;
        }
    
    }
    View Code

    Body类:该实体类中 定义了body标签中的子标签属性字段。。。

          body标签中的子标签可依据具体实际情况而定。。。

    package com.linjm.xml;
    
    import com.thoughtworks.xstream.annotations.XStreamAlias;
    
    public class Body {
        @XStreamAlias("div")
        private String div;
        
        @XStreamAlias("span")
        private String span;
        
        @XStreamAlias("font")
        private String font;
        
        @XStreamAlias("input")
        private String input;
    
        public String getDiv() {
            return div;
        }
    
        public void setDiv(String div) {
            this.div = div;
        }
    
        public String getSpan() {
            return span;
        }
    
        public void setSpan(String span) {
            this.span = span;
        }
    
        public String getFont() {
            return font;
        }
    
        public void setFont(String font) {
            this.font = font;
        }
    
        public String getInput() {
            return input;
        }
    
        public void setInput(String input) {
            this.input = input;
        }
    
    }
    View Code

    XMLUtil类:该类定义了xStream中组装XML字符串和解析XML字符串封装方法。。。

          toXml()方法用于将Java对象转为XML字符串;

          fromXml()方法用于解析XML字符串转换为Java对象。

    package com.linjm.xml;
    
    import com.thoughtworks.xstream.XStream;
    import com.thoughtworks.xstream.io.xml.DomDriver;
    
    public class XMLUtil {
    
        /**
         * @desc 将JAVA对象转XML字符串
         * @author JimLy
         * @date 20160423
         * */
        public static String toXml(Object obj) {
            XStream xs = new XStream(new DomDriver());
            xs.processAnnotations(obj.getClass());
            
            return xs.toXML(obj);
        }
    
        /**
         * @desc 将XML字符串转JAVA对象
         * @author JimLy
         * @date 20160423
         * */
        @SuppressWarnings("unchecked")
        public static <T> T fromXml(String xmlStr, Class<T> cls) {
            XStream xs = new XStream(new DomDriver());
            xs.processAnnotations(cls);
            T obj = (T) xs.fromXML(xmlStr);
            
            return obj;
        }
    
    }
    View Code

      代码实现很简单,也并不是很复杂。。。基本上都是可以看得懂的。。。

    为了不使代码篇幅太长,我还是分多个类文件写、就不都写在一个类文件中。。

    程序结构设计上存在点瑕疵,,有点啰嗦。。目前只体现出程序的功能。。。

    对于xStream也是初次涉及,,也许、大概可能吧、会存在更好的实现方法以及

    程序设计上需要优化的地方另当别论。。。

      看完博文觉得对这个有点兴趣的话,可以自己动手code一番。。。

    也不枉花了这么多时间来看,,既然看了就得有点收获不是吗。。。

    需要用到的jar包:xstream-1.4.7.jar

  • 相关阅读:
    (多行)省略号隐藏超出范围的文本
    JSON.parse()和JSON.stringify()
    如何获取每个input的值
    禁止文字被选中
    javasctipt数据类型转换
    jq实现伸缩二级菜单
    table-layout 表格宽度不随文字改变
    VNC安装和配置
    HTML超连接的使用
    HTML图像标记
  • 原文地址:https://www.cnblogs.com/JimLy-BUG/p/5426096.html
Copyright © 2011-2022 走看看