iteye_17041 2013-09-02 23:18
浏览 568
已采纳

java 如何提供xml接口

有一个需求,web 必须提供xml的结果(接口),大家都是怎么做的?是写好xml文件,然后替换xml的结果吗?
或者是拼凑xml然后输出?这个好像很不专业。

  • 写回答

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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题