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\">\n";
        
        System.out.println("生成HTML:\n" + 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM