java注解生成xml和包含CDATA问题

来源:互联网 发布:星辰0灯尤格萨隆数据 编辑:程序博客网 时间:2024/05/16 02:07

百度java生成xml,有一大推的文章,主要的生成方式一种使用Dom4J ,还有一种使用Jdk自带注解类!
下面主要整理我注解类的使用,(可以参考这篇文章Dom4J生成xml和包含CDATA问题)和xml中CDATA 问题的解决方法!
1:要生成的xml原始文件!

<?xml version="1.0" encoding="utf-8"?> <item>   <id>35399645973</id>     <title><![CDATA[补水首选水密码水保湿美白护洗护组合三件]]> </title>   <category><![CDATA[美妆>保湿>洗护]]></category>  <url><![CDATA[http://www.example.com/detail-35399645973]]> </url>   <url_wap><![CDATA[http://m.example.com/de99645973]]> </url_wap>     <price>310</price>     <promotion_price>93.8</promotion_price> <wap_price>85</wap_price> <sub_item_ids>        <sub_item_id>35399645973_1</sub_item_id>        <sub_item_id>35399645973_2</sub_item_id>        <sub_item_id>35399645973_3</sub_item_id>        ……</sub_item_ids>  <detail><![CDATA[商品详情,支持html图文混排]]> </detail>   <status>1<status>    <pic_main>     <img>        <url><![CDATA[http://www.example.com/10777829/T_400x400.jpg]]> </url>       <size>400x400</size>     </img>   </pic_main>   <pic_extra>     <img>       <url><![CDATA[http://www.example.com/10777821_400x400.jpg]]> </url>       <size>400x400</size>      </img>       <img>       <url><![CDATA[http://www.example.com/10777822_400x400.jpg]]> </url>       <size>400x400</size>      </img>     </pic_extra >   </item> 

2:xml对应的model类!
(1):FanLiProductInofMsg.java

import java.util.List;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlElementWrapper;import javax.xml.bind.annotation.XmlRootElement;/** *  * @author aflyun * @date 2016.06.12 * */@XmlRootElement(name="item")public class FanLiProductInofMsg {    @XmlAttribute    private String version;    @XmlElement    private String id;    @XmlElement    private String title;    @XmlElement    private String category;    @XmlElement    private String url;//Pc商品的url    @XmlElement(name="url_wap")    private String urlWap;//Wap商品的url  url_wap    @XmlElement    private String price;    @XmlElement(name="promotion_price")    private String promotionPrice;//promotion_price    @XmlElement(name="wap_price")    private String wapPrice;//wap_price    @XmlElementWrapper(name="sub_item_ids")    @XmlElement(name="sub_item_id")    private List<String> subItemIds;//sub_item_ids    @XmlElement    private String detail;//detail    @XmlElement    private String status;//status    @XmlElementWrapper(name="pic_main")    @XmlElement(name="img")    private List<Img> mainImg;//pic_main    @XmlElementWrapper(name="pic_extra")    @XmlElement(name="img")    private List<Img> extraImg;//pic_extra    public void setVersion(String version) {        this.version = version;    }    public void setId(String id) {        this.id = id;    }    public void setTitle(String title) {        this.title = title;    }    public void setCategory(String category) {        this.category = category;    }    public void setUrl(String url) {        this.url = url;    }    public void setUrlWap(String urlWap) {        this.urlWap = urlWap;    }    public void setPrice(String price) {        this.price = price;    }    public void setPromotionPrice(String promotionPrice) {        this.promotionPrice = promotionPrice;    }    public void setWapPrice(String wapPrice) {        this.wapPrice = wapPrice;    }    public void setSubItemIds(List<String> subItemIds) {        this.subItemIds = subItemIds;    }    public void setDetail(String detail) {        this.detail = detail;    }    public void setStatus(String status) {        this.status = status;    }    public void setMainImg(List<Img> mainImg) {        this.mainImg = mainImg;    }    public void setExtraImg(List<Img> extraImg) {        this.extraImg = extraImg;    }}

(2):Img .java

import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;/** *  * @author aflyun * @date 2016.06.12 * */@XmlRootElementpublic class Img {    @XmlElement(name="url")    private String url;    @XmlElement(name="size")    private String size;    public void setUrl(String url) {        this.url = url;    }    public void setSize(String size) {        this.size = size;    }}

3:生成过程,已经CDATA问题处理!

package com.dufy.test.xml;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileWriter;import java.io.PrintWriter;import java.util.ArrayList;import java.util.List;import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;import javax.xml.transform.sax.SAXResult;import org.apache.xml.serialize.OutputFormat;import org.apache.xml.serialize.XMLSerializer;import org.junit.Test;import com.kuyu.b2b2c.product.fanli.vo.FanLiProductInofMsg;import com.kuyu.b2b2c.product.fanli.vo.Img;public class JuintXmlTest {    private static Marshaller marshal;    @Test    public void testXml() throws Exception {        List<String> list = new ArrayList<String>();        list.add("11_11_11");        list.add("22_22_22");        list.add("33_33_33");        List<Img> imgList = new ArrayList<Img>();        Img img = null;        for (int i = 0; i < 2; i++) {            img = new Img();            img.setUrl("-" + i + "-");            img.setSize("40×40");            imgList.add(img);        }        FanLiProductInofMsg fps = new FanLiProductInofMsg();        fps.setVersion("1.0");        fps.setId("110");        fps.setTitle("4K 高清");        fps.setCategory("电视>4K>高清");        fps.setUrl("http://baidu.com");        fps.setUrlWap("http://baidu.wap.com");        fps.setPrice("100");        fps.setPromotionPrice("111");        fps.setWapPrice("113");        fps.setSubItemIds(list);        fps.setDetail("wwwwwwwwwwwwwwwwwwwwwww");        fps.setStatus("1");        fps.setMainImg(imgList);        fps.setExtraImg(imgList);         PrintWriter pw = new PrintWriter(new File("D:/test.xml"));         String ojbectToXmlWithCDATA = ojbectToXmlWithCDATA(FanLiProductInofMsg.class, fps);         System.out.println(ojbectToXmlWithCDATA);         pw.println(ojbectToXmlWithCDATA);         pw.close();    }     public static String ojbectToXmlWithCDATA(Class clazz, Object obj) throws Exception {              JAXBContext context = JAXBContext.newInstance(clazz);              // configure an OutputFormat to handle CDATA            OutputFormat of = new OutputFormat();            of.setCDataElements(                  new String[] { "^title", //                                   "^category",                                 "^url",                                 "^url_wap",                                 "^detail"                                 }); //              // set any other options you'd like            of.setPreserveSpace(true);            of.setIndenting(true);            // create the serializer            ByteArrayOutputStream op = new ByteArrayOutputStream();              XMLSerializer serializer = new XMLSerializer(op, of);              SAXResult result = new SAXResult(serializer.asContentHandler());              Marshaller mar = context.createMarshaller();             mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);              mar.marshal(obj, result);              return op.toString("utf-8");          }  }

setCDataElements 这里面你标注需CDATA 的字段!

上面的这个例子可以直接拷贝运行,网上还一些其他的方法生成xml和CDATA,如果你有好的方法,欢迎分享给我,谢谢!
4:参考文章
(1):Jaxb2 转换XML文档
(2):Jaxb annotation初步使用
(3):三步解决JAXB生成XML包含CDATA问题—JAVA编程

0 0
原创粉丝点击