java 如何提供xml接口

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

直接有对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]

可以参考我写的基础开发平台解决方案:

https://git.oschina.net/fand/fand/blob/master/modules/fand-context/src/main/java/com/fand/context/mapper/JaxbMapper.java

现在流行用json。

可以用jaxb

XStream