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

百度 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 {

<span class="hljs-meta">@XmlAttribute</span>
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> version;

<span class="hljs-meta">@XmlElement</span>
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> id;

<span class="hljs-meta">@XmlElement</span>
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> title;

<span class="hljs-meta">@XmlElement</span>
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> category;

<span class="hljs-meta">@XmlElement</span>
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> url;<span class="hljs-comment">//Pc商品的url</span>

<span class="hljs-meta">@XmlElement</span>(name=<span class="hljs-string">"url_wap"</span>)
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> urlWap;<span class="hljs-comment">//Wap商品的url  url_wap</span>

<span class="hljs-meta">@XmlElement</span>
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> price;

<span class="hljs-meta">@XmlElement</span>(name=<span class="hljs-string">"promotion_price"</span>)
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> promotionPrice;<span class="hljs-comment">//promotion_price</span>

<span class="hljs-meta">@XmlElement</span>(name=<span class="hljs-string">"wap_price"</span>)
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> wapPrice;<span class="hljs-comment">//wap_price</span>

<span class="hljs-meta">@XmlElementWrapper</span>(name=<span class="hljs-string">"sub_item_ids"</span>)
<span class="hljs-meta">@XmlElement</span>(name=<span class="hljs-string">"sub_item_id"</span>)
<span class="hljs-keyword">private</span> <span class="hljs-title class_">List</span>&lt;<span class="hljs-title class_">String</span>&gt; subItemIds;<span class="hljs-comment">//sub_item_ids</span>

<span class="hljs-meta">@XmlElement</span>
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> detail;<span class="hljs-comment">//detail</span>

<span class="hljs-meta">@XmlElement</span>
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> status;<span class="hljs-comment">//status</span>


<span class="hljs-meta">@XmlElementWrapper</span>(name=<span class="hljs-string">"pic_main"</span>)
<span class="hljs-meta">@XmlElement</span>(name=<span class="hljs-string">"img"</span>)
<span class="hljs-keyword">private</span> <span class="hljs-title class_">List</span>&lt;<span class="hljs-title class_">Img</span>&gt; mainImg;<span class="hljs-comment">//pic_main</span>

<span class="hljs-meta">@XmlElementWrapper</span>(name=<span class="hljs-string">"pic_extra"</span>)
<span class="hljs-meta">@XmlElement</span>(name=<span class="hljs-string">"img"</span>)
<span class="hljs-keyword">private</span> <span class="hljs-title class_">List</span>&lt;<span class="hljs-title class_">Img</span>&gt; extraImg;<span class="hljs-comment">//pic_extra</span>


<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setVersion</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> version</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">version</span> = version;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setId</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> id</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">id</span> = id;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setTitle</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> title</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">title</span> = title;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setCategory</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> category</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">category</span> = category;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setUrl</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> url</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">url</span> = url;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setUrlWap</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> urlWap</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">urlWap</span> = urlWap;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setPrice</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> price</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">price</span> = price;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setPromotionPrice</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> promotionPrice</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">promotionPrice</span> = promotionPrice;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setWapPrice</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> wapPrice</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">wapPrice</span> = wapPrice;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setSubItemIds</span>(<span class="hljs-params">List&lt;<span class="hljs-built_in">String</span>&gt; subItemIds</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">subItemIds</span> = subItemIds;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setDetail</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> detail</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">detail</span> = detail;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setStatus</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> status</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">status</span> = status;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setMainImg</span>(<span class="hljs-params">List&lt;Img&gt; mainImg</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">mainImg</span> = mainImg;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setExtraImg</span>(<span class="hljs-params">List&lt;Img&gt; extraImg</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">extraImg</span> = extraImg;
}

}

(2):Img .java

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
 * 
 * @author aflyun
 * @date 2016.06.12
 *
 */
@XmlRootElement
public class Img {
<span class="hljs-meta">@XmlElement</span>(name=<span class="hljs-string">"url"</span>)
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> url;

<span class="hljs-meta">@XmlElement</span>(name=<span class="hljs-string">"size"</span>)
<span class="hljs-keyword">private</span> <span class="hljs-title class_">String</span> size;

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setUrl</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> url</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">url</span> = url;
}

<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">setSize</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> size</span>) {
	<span class="hljs-variable language_">this</span>.<span class="hljs-property">size</span> = 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 {

<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Marshaller marshal;

<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">testXml</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> Exception {
	List&lt;String&gt; list = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span>&lt;String&gt;();
	list.add(<span class="hljs-string">"11_11_11"</span>);
	list.add(<span class="hljs-string">"22_22_22"</span>);
	list.add(<span class="hljs-string">"33_33_33"</span>);
	List&lt;Img&gt; imgList = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span>&lt;Img&gt;();
	<span class="hljs-type">Img</span> <span class="hljs-variable">img</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
	<span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i &lt; <span class="hljs-number">2</span>; i++) {
		img = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Img</span>();
		img.setUrl(<span class="hljs-string">"-"</span> + i + <span class="hljs-string">"-"</span>);
		img.setSize(<span class="hljs-string">"40×40"</span>);
		imgList.add(img);
	}
	
	<span class="hljs-type">FanLiProductInofMsg</span> <span class="hljs-variable">fps</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">FanLiProductInofMsg</span>();
	fps.setVersion(<span class="hljs-string">"1.0"</span>);
	fps.setId(<span class="hljs-string">"110"</span>);
	fps.setTitle(<span class="hljs-string">"4K 高清"</span>);
	fps.setCategory(<span class="hljs-string">"电视&gt;4K&gt;高清"</span>);
	fps.setUrl(<span class="hljs-string">"http://baidu.com"</span>);
	fps.setUrlWap(<span class="hljs-string">"http://baidu.wap.com"</span>);
	fps.setPrice(<span class="hljs-string">"100"</span>);
	fps.setPromotionPrice(<span class="hljs-string">"111"</span>);
	fps.setWapPrice(<span class="hljs-string">"113"</span>);
	fps.setSubItemIds(list);
	fps.setDetail(<span class="hljs-string">"wwwwwwwwwwwwwwwwwwwwwww"</span>);
	fps.setStatus(<span class="hljs-string">"1"</span>);
	fps.setMainImg(imgList);
	fps.setExtraImg(imgList);
	
	 <span class="hljs-type">PrintWriter</span> <span class="hljs-variable">pw</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">PrintWriter</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">File</span>(<span class="hljs-string">"D:/test.xml"</span>));
	 <span class="hljs-type">String</span> <span class="hljs-variable">ojbectToXmlWithCDATA</span> <span class="hljs-operator">=</span> ojbectToXmlWithCDATA(FanLiProductInofMsg.class, fps);
	 System.out.println(ojbectToXmlWithCDATA);
	 pw.println(ojbectToXmlWithCDATA);
	 pw.close();
	
	
	
}
 <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title function_">ojbectToXmlWithCDATA</span><span class="hljs-params">(Class clazz, Object obj)</span> <span class="hljs-keyword">throws</span> Exception {  
  
        <span class="hljs-type">JAXBContext</span> <span class="hljs-variable">context</span> <span class="hljs-operator">=</span> JAXBContext.newInstance(clazz);  
        <span class="hljs-comment">// configure an OutputFormat to handle CDATA</span>
	    <span class="hljs-type">OutputFormat</span> <span class="hljs-variable">of</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">OutputFormat</span>();
	    of.setCDataElements(
			  <span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[] { <span class="hljs-string">"^title"</span>, <span class="hljs-comment">//  </span>
					  		 <span class="hljs-string">"^category"</span>,
					  		 <span class="hljs-string">"^url"</span>,
					  		 <span class="hljs-string">"^url_wap"</span>,
					  		 <span class="hljs-string">"^detail"</span>
					  		 }); <span class="hljs-comment">//  </span>

	    <span class="hljs-comment">// set any other options you'd like</span>
	    of.setPreserveSpace(<span class="hljs-literal">true</span>);
	    of.setIndenting(<span class="hljs-literal">true</span>);
	    <span class="hljs-comment">// create the serializer</span>
        <span class="hljs-type">ByteArrayOutputStream</span> <span class="hljs-variable">op</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ByteArrayOutputStream</span>();  
        <span class="hljs-type">XMLSerializer</span> <span class="hljs-variable">serializer</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">XMLSerializer</span>(op, of);  
        <span class="hljs-type">SAXResult</span> <span class="hljs-variable">result</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">SAXResult</span>(serializer.asContentHandler());  
        <span class="hljs-type">Marshaller</span> <span class="hljs-variable">mar</span> <span class="hljs-operator">=</span> context.createMarshaller(); 
        mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, <span class="hljs-literal">true</span>);  
        mar.marshal(obj, result);  
        
        <span class="hljs-keyword">return</span> op.toString(<span class="hljs-string">"utf-8"</span>);  
    }  

}

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

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


欢迎访问我的 csdn 博客,我们一同成长!

"不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!"
http://blog.csdn.net/u010648555