使用jdk自帶的api做對象和XML互轉

原文鏈接:https://blog.csdn.net/liliang_11676/article/details/81837215

項目中調用別人的接口,返回的數據是String類型的XML,所以需要XML轉成對象,首先貼一下XML樣式

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<KeyListXml>
    <KEY_INFO>
        <kc_id>{3BDE3D58-96F5-49D8-BA36-CB94097CCE1A}</kc_id>
        <key_name>company-DefaultControl</key_name>
        <key_kind>B</key_kind>
        <key_type>0</key_type>
    </KEY_INFO>
</KeyListXml>

我們需要根據XML新建對應的對象,接口返回的<KEY_INFO>可能是多個,我這裏只貼出來一個先,但是我們建對象的時候需要考慮進來

package pojo;


import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
						
@XmlRootElement(name = "KeyListXml") //表示以KeyListXml作爲跟節點來解析
public class KeyListXml {
	
	private List<KeyInfo>  keyInfo;

	public List<KeyInfo> getKeyInfo() {
		return keyInfo;
	}

	@XmlElement(name = "KEY_INFO")
	//@XmlElementWrapper(name="KEY_INFO") //這個註解表示KEY_INFO是多個
	public void setKeyInfo(List<KeyInfo> keyInfo) {
		this.keyInfo = keyInfo;
	}



}
package pojo;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "KEY_INFO")
public class KeyInfo {

	private String kcId;
	
	private String keyName;
	
	private String keyKind;
	
	private long keyType;

	public String getKcId() {
		return kcId;
	}

	@XmlElement(name = "kc_id") //這個註解和XML裏面的字段對應
	public void setKcId(String kcId) {
		this.kcId = kcId;
	}

	public String getKeyName() {
		return keyName;
	}

	@XmlElement(name = "key_name")
	public void setKeyName(String keyName) {
		this.keyName = keyName;
	}

	public String getKeyKind() {
		return keyKind;
	}

	@XmlElement(name = "key_kind")
	public void setKeyKind(String keyKind) {
		this.keyKind = keyKind;
	}

	public long getKeyType() {
		return keyType;
	}
	
	@XmlElement(name = "key_type")
	public void setKeyType(long keyType) {
		this.keyType = keyType;
	}

	@Override
	public String toString() {
		return "KeyInfo [kcId=" + kcId + ", keyName=" + keyName + ", keyKind=" + keyKind + ", keyType=" + keyType + "]";
	}
	
	

}
 package utils;
    
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import java.io.StringWriter;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    
    /**
     * bean<->xml互轉工具類
     * @author tanwg
     * @date 2017年8月30日
     */
    public class XmlHelper {
        public static <T> T toObj(Class<T> clazz, String xml) {
            try {
                JAXBContext context = JAXBContext
                        .newInstance(new Class[] { clazz });
                InputStream buf = new ByteArrayInputStream(xml.getBytes("UTF-8"));
                return (T) context.createUnmarshaller().unmarshal(buf);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static <T> String toXml(T obj) {
            try {
                StringWriter write = new StringWriter();
                JAXBContext context = JAXBContext.newInstance(new Class[] { obj
                        .getClass() });
                context.createMarshaller().marshal(obj, write);
                return write.getBuffer().toString();
            } catch (JAXBException e) {
                e.printStackTrace();
            }
            return "";
        }
    }

在我們需要解析的地方調用解析方法就可以了

//TODO 解析xml
KeyListXml keyListXml = (KeyListXml)XmlHelper.toObj(KeyListXml.class, varRet.toString());
List<KeyInfo> infos = keyListXml.getKeyInfo();
if(infos != null && !infos.isEmpty()){
	return infos.get(0);
}

解析出來就是一個KeyInfo對象了,同時我們也可以對象轉成 XML,只需要調用XmlHelper .toXml(KerInfo),就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章