java JAXB 如何处理List<Map<String, String>>

清莹 发布于 2013/09/27 09:56
阅读 2K+
收藏 0

entity如下:

public class User {
	private int count;
	private List<Map<String, String>> rows;
        
}

通过JAXB如何序列化成以下格式

<user>
	<count></count>
	<rows>
		<row>
			<id></id>
			<name></name>
		</row>
		<row>
			<id></id>
			<name></name>
		</row>
	</rows>
<user>

其中id、name为Map中的Key,主要是这里的Map如何才能序列化这种格式

望各位不吝赐教,谢过



加载中
0
清莹
这种方式是不是行不通啊?是不是都放假了!
0
黄正文
黄正文

JAXB可以根据xml格式编写xsd文件,然后用jdk/bin目录提供的xcj.exe生成对应的java类文件。

我对JAXB也是一知半解。不知道对你有帮助没有。

http://www.oschina.net/code/snippet_780719_20900

 

 

0
清莹
jaxb可以自定义序列化方式,高手指点自己写了一个Adapter,可以实现要求了,附上代码
public class DataXmlAdapter extends XmlAdapter<Object, List<Map<String, String>>> {

	/**
	 * 序列化方法。
	 * 
	 * 把java bean转换成Element,方便JAXB按照指定格式序列化。
	 */
	@Override
	public Object marshal(List<Map<String, String>> rows) throws Exception {
		// TODO Auto-generated method stub
		DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document document = builder.newDocument();
		Element rootEle = document.createElement("rows");
		
		for(Map<String, String> row:rows){
			Element rowEle = document.createElement("row");
			
			Iterator<Entry<String, String>> itera = row.entrySet().iterator();
			while (itera.hasNext()) {
				Entry<String, String> entry = itera.next();
				String key = entry.getKey();
				String value = entry.getValue();
				if (key == null || key.equals("")) {
					continue;
				}
				if (value == null) {
					value = "";
				}
				Element detailEle = document.createElement(key);
				detailEle.setTextContent(value);
				rowEle.appendChild(detailEle);
			}
			rootEle.appendChild(rowEle);
		}
		document.appendChild(rootEle);
		return rootEle;
	}

	/**
	 * 反序列化方法。
	 * 
	 * 把Element转换成java bean。
	 */
	@Override
	public List<Map<String, String>> unmarshal(Object datas) throws Exception {
		// TODO Auto-generated method stub
		if(datas==null){
			return null;
		}
		NodeList rowlist = ((Element)datas).getChildNodes();
		if(rowlist == null){
			return null;
		}
		int rowCount = rowlist.getLength();
		if(rowCount == 0){
			return null;
		}
		
		List<Map<String, String>> result = new ArrayList<Map<String,String>>();
		for(int i = 0; i<rowCount; i++){
			Node rowNode = rowlist.item(i);
			if(!"detail".equals(rowNode.getNodeName())){
				continue;
			}
			
			NodeList detailList = rowNode.getChildNodes();
			if(detailList == null){
				continue;
			}
			int detailCount = detailList.getLength();
			if(detailCount == 0){
				continue;
			}
			
			Map<String, String> detailMap = new HashMap<String, String>();
			for(int j = 0; j < detailCount; j++){
				Node detailNode = detailList.item(j);
				String key = detailNode.getNodeName();
				String value = detailNode.getTextContent();
				if(key == null || "".equals(key)){
					continue;
				}
				detailMap.put(key, value);
			}
			result.add(detailMap);
		}
		return result;
	}

}
返回顶部
顶部