public class XMLConverUtil{
private static final ThreadLocal<Map<Class<?>,Marshaller>> mMapLocal = new ThreadLocal<Map<Class<?>,Marshaller>>() {
@Override
protected Map<Class<?>, Marshaller> initialValue() {
return new HashMap<Class<?>, Marshaller>();
}
};
private static final ThreadLocal<Map<Class<?>,Unmarshaller>> uMapLocal = new ThreadLocal<Map<Class<?>,Unmarshaller>>(){
@Override
protected Map<Class<?>, Unmarshaller> initialValue() {
return new HashMap<Class<?>, Unmarshaller>();
}
};
/**
* XML to Object
* @param <T> T
* @param clazz clazz
* @param xml xml
* @return T
*/
public static <T> T convertToObject(Class<T> clazz,String xml){
return convertToObject(clazz,new StringReader(xml));
}
/**
* XML to Object
* @param <T> T
* @param clazz clazz
* @param inputStream inputStream
* @return T
*/
public static <T> T convertToObject(Class<T> clazz,InputStream inputStream){
return convertToObject(clazz,new InputStreamReader(inputStream));
}
/**
* XML to Object
* @param <T> T
* @param clazz clazz
* @param inputStream inputStream
* @param charset charset
* @return T
*/
public static <T> T convertToObject(Class<T> clazz,InputStream inputStream,Charset charset){
return convertToObject(clazz,new InputStreamReader(inputStream, charset));
}
/**
* XML to Object
* @param <T> T
* @param clazz clazz
* @param reader reader
* @return T
*/
@SuppressWarnings("unchecked")
public static <T> T convertToObject(Class<T> clazz,Reader reader){
try {
Map<Class<?>, Unmarshaller> uMap = uMapLocal.get();
if(!uMap.containsKey(clazz)){
JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
uMap.put(clazz, unmarshaller);
}
return (T) uMap.get(clazz).unmarshal(reader);
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
/**
* Object to XML
* @param object object
* @return xml
*/
public static String convertToXML(Object object){
try {
Map<Class<?>, Marshaller> mMap = mMapLocal.get();
if(!mMap.containsKey(object.getClass())){
JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//设置CDATA输出字符
marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {
public void escape(char[] ac, int i, int j, boolean flag, Writer writer) throws IOException {
writer.write(ac, i, j);
}
});
mMap.put(object.getClass(), marshaller);
}
StringWriter stringWriter = new StringWriter();
mMap.get(object.getClass()).marshal(object,stringWriter);
return stringWriter.getBuffer().toString();
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
/**
* 转换简单的xml to map
* @param xml xml
* @return map
*/
public static Map<String,String> convertToMap(String xml){
Map<String, String> map = new LinkedHashMap<String,String>();
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(xml);
InputSource is = new InputSource(sr);
Document document = db.parse(is);
Element root = document.getDocumentElement();
if(root != null){
NodeList childNodes = root.getChildNodes();
if(childNodes != null && childNodes.getLength()>0){
for(int i = 0;i < childNodes.getLength();i++){
Node node = childNodes.item(i);
if( node != null && node.getNodeType() == Node.ELEMENT_NODE){
map.put(node.getNodeName(), node.getTextContent());
}
}
}
}
} catch (DOMException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return map;
}
}