有一个需求,web 必须提供xml的结果(接口),大家都是怎么做的?是写好xml文件,然后替换xml的结果吗?
或者是拼凑xml然后输出?这个好像很不专业。
java 如何提供xml接口
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
5条回答 默认 最新
- iteye_14230 2013-09-03 05:47关注
直接有对bean2xml的工具
[code="java"]package com.fand.context.mapper;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.namespace.QName;import org.apache.commons.lang.StringUtils;
import org.springframework.http.converter.HttpMessageConversionException;
import org.springframework.util.Assert;import com.google.common.base.Throwables;
/**
- 使用Jaxb2.0实现XML<->Java Object的Mapper. 在创建时需要设定所有需要序列化的Root对象的Class.
- 特别支持Root对象是Collection的情形.
-
@author yaoHT
*/
public class JaxbMapper {/**
-
封装Root Element 是 Collection的情况.
*/
public static class CollectionWrapper {@XmlAnyElement
private Collection<?> collection;
}
private static ConcurrentMap, JAXBContext> jaxbContexts = new ConcurrentHashMap, JAXBContext>();
/**
-
创建Marshaller并设定encoding(可为null). 线程不安全,需要每次创建或pooling。
*/
public static Marshaller createMarshaller(final Class<?> clazz, final String encoding) {
try {
final JAXBContext jaxbContext = JaxbMapper.getJaxbContext(clazz);final Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); if (StringUtils.isNotBlank(encoding)) { marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding); } return marshaller;
} catch (final JAXBException e) {
throw new RuntimeException(Throwables.getStackTraceAsString(e));
}
}
/**
-
创建UnMarshaller. 线程不安全,需要每次创建或pooling。
*/
public static Unmarshaller createUnmarshaller(final Class<?> clazz) {
try {
final JAXBContext jaxbContext = JaxbMapper.getJaxbContext(clazz);return jaxbContext.createUnmarshaller();
} catch (final JAXBException e) {
throw new RuntimeException(Throwables.getStackTraceAsString(e));
}
}
/**
-
Xml->Java Object.
*/
@SuppressWarnings("unchecked")
public static T fromXml(final String xml, final Class clazz) {
try {
final StringReader reader = new StringReader(xml);return (T) JaxbMapper.createUnmarshaller(clazz).unmarshal(reader);
} catch (final JAXBException e) {
throw new RuntimeException(Throwables.getStackTraceAsString(e));
}
}
private static JAXBContext getJaxbContext(final Class<?> clazz) {
Assert.notNull(clazz, "'clazz' must not be null");
JAXBContext jaxbContext = JaxbMapper.jaxbContexts.get(clazz);
if (jaxbContext == null) {
try {
jaxbContext = JAXBContext.newInstance(clazz, CollectionWrapper.class);JaxbMapper.jaxbContexts.putIfAbsent(clazz, jaxbContext); } catch (final JAXBException ex) { throw new HttpMessageConversionException("Could not instantiate JAXBContext for class [" + clazz + "]: " + ex.getMessage(), ex); } } return jaxbContext;
}
/**
- Java Collection->Xml without encoding, 特别支持Root Element是Collection的情形. */ public static String toXml(final Collection<?> root, final String rootName, final Class<?> clazz) { return JaxbMapper.toXml(root, rootName, clazz, null); }
/**
-
Java Collection->Xml with encoding, 特别支持Root Element是Collection的情形.
*/
public static String toXml(final Collection<?> root, final String rootName, final Class<?> clazz,
final String encoding) {
try {
final CollectionWrapper wrapper = new CollectionWrapper();wrapper.collection = root; final JAXBElement<CollectionWrapper> wrapperElement = new JAXBElement<CollectionWrapper>(new QName( rootName), CollectionWrapper.class, wrapper); final StringWriter writer = new StringWriter(); JaxbMapper.createMarshaller(clazz, encoding).marshal(wrapperElement, writer); return writer.toString();
} catch (final JAXBException e) {
throw new RuntimeException(Throwables.getStackTraceAsString(e));
}
}
/**
-
Java Object->Xml without encoding.
*/
public static String toXml(final Object root) {
final Class<?> clazz = root.getClass();return JaxbMapper.toXml(root, clazz, null);
}
/**
-
Java Object->Xml with encoding.
*/
public static String toXml(final Object root, final Class<?> clazz, final String encoding) {
try {
final StringWriter writer = new StringWriter();JaxbMapper.createMarshaller(clazz, encoding).marshal(root, writer); return writer.toString();
} catch (final JAXBException e) {
throw new RuntimeException(Throwables.getStackTraceAsString(e));
}
}
/**
-
Java Object->Xml with encoding.
*/
public static String toXml(final Object root, final String encoding) {
final Class<?> clazz = root.getClass();return JaxbMapper.toXml(root, clazz, encoding);
}
}
[/code]
-
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 求差集那个函数有问题,有无佬可以解决
- ¥15 【提问】基于Invest的水源涵养
- ¥20 微信网友居然可以通过vx号找到我绑的手机号
- ¥15 寻一个支付宝扫码远程授权登录的软件助手app
- ¥15 解riccati方程组
- ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
- ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
- ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
- ¥50 树莓派安卓APK系统签名
- ¥65 汇编语言除法溢出问题