0 0

JAXB 如何序列化List<Map<String, String>>5

bean结构简单如下
public class User {
	private int count;
	private List<Map<String, String>> rows;
        
}

getter、setter省略
如何才能序列化成下面的格式
<user>
	<count></count>
	<rows>
		<row>
			<id></id>
			<name></name>
		</row>
		<row>
			<id></id>
			<name></name>
		</row>
	</rows>
<user>

其中id、name为Map中的Key。
望各位不吝赐教,谢谢
2013年9月29日 15:10

1个答案 按时间排序 按投票排序

0 0

采纳的答案

import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {

	/**
	 * 
	 *JAXB XML适配器
	 *
	 */
	public static class UserRowsXmlAdapter extends
			XmlAdapter<Object, List<Map<String, String>>> {

		/**
		 * 把 JAVA转化成ELEMENT对象
		 */
		@Override
		public Object marshal(List<Map<String, String>> rows) throws Exception {

			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document document = db.newDocument();
			Element rootElement = document.createElement("myrows");// 这里名字随便,以外面为准,JAXB会自动替换名字的
			document.appendChild(rootElement);

			for (Map<String, String> row : rows) {

				Element rowEle = document.createElement("row");

				Element idEle = document.createElement("id");
				Element nameEle = document.createElement("name");

				Entry<String, String> entry = row.entrySet().iterator().next();// 第一个ENTRY
				String id = entry.getKey();// ID
				String name = entry.getValue();// NAME

				idEle.setTextContent(id);
				nameEle.setTextContent(name);
				rowEle.appendChild(idEle);
				rowEle.appendChild(nameEle);
				rootElement.appendChild(rowEle);
			}
			return rootElement;
		}

		/**
		 * 把XML ELEMENT转化成JAVA对象
		 */
		@Override
		public List<Map<String, String>> unmarshal(Object rowsElement)
				throws Exception {

			if (rowsElement == null) {
				return null;
			}

			Element rowsEle = (Element) rowsElement;

			NodeList rowNodes = rowsEle.getChildNodes();
			int rowCount = (rowNodes == null ? 0 : rowNodes.getLength());
			if (rowCount == 0) {
				return null;
			}
			List<Map<String, String>> result = new ArrayList<Map<String, String>>(
					rowCount);

			for (int i = 0; i < rowCount; i++) {
				Node rowNode = rowNodes.item(i);
				if (!"row".equals(rowNode.getNodeName())) {
					System.out.println("发现非法节点:" + rowNode.getNodeName()
							+ "忽略.");
					continue;
				}
				NodeList idNameNodes = rowNode.getChildNodes();
				int nodeSize = (idNameNodes == null ? 0 : idNameNodes
						.getLength());
				if (nodeSize == 0) {
					continue;
				}
				Map<String, String> row = new HashMap<String, String>();
				String id = null;
				String name = null;
				for (int j = 0; j < nodeSize; j++) {
					Node node = idNameNodes.item(j);
					String nodeName = node.getNodeName();
					String nodeValue = node.getTextContent();
					if ("id".equals(nodeName)) {
						id = nodeValue;
					} else if ("name".equals(nodeName)) {
						name = nodeValue;
					}
					if (id != null && name != null) {
						break;
					}
				}

				if (id != null) {
					row.put(id, name);
				} else {
					System.out.println("未在row节点里发现id节点,忽略.");
				}
				result.add(row);
			}

			return result;
		}

	}
	
	@XmlElement(name="count")
	private int count;
	@XmlElement(name="rows")
	@XmlJavaTypeAdapter(UserRowsXmlAdapter.class)
	private List<Map<String, String>> rows;

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}

	public List<Map<String, String>> getRows() {
		return rows;
	}

	public void setRows(List<Map<String, String>> rows) {
		this.rows = rows;
	}

	@Override
	public String toString() {
		return "User [count=" + count + ", rows=" + rows + "]";
	}

	public static void main(String[] args) throws JAXBException {
		User u = new User();
		List<Map<String, String>> rows = new ArrayList<Map<String, String>>(2);
		Map<String, String> row = new HashMap<String, String>();
		row.put("1", "土豆");// userid=1,username=土豆
		rows.add(row);
		row = new HashMap<String, String>();
		row.put("2", "洋葱");// userid=2,username=洋葱
		rows.add(row);
		u.setCount(rows.size());
		u.setRows(rows);

		JAXBContext jc = JAXBContext.newInstance(User.class);
		StringWriter writer = new StringWriter();
		jc.createMarshaller().marshal(u, writer);
		System.out.println("Marshalled xml==>");
		System.out.println(writer);
		String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
				+ "<user><count>2</count><rows><row><id>1</id><name>土豆</name>"
				+ "</row><row><id>2</id><name>洋葱</name>"
				+ "</row></rows></user>";

		User newu = (User) jc.createUnmarshaller().unmarshal(
				new StringReader(xml));
		System.out.println("UnMarshalled user==>");
		System.out.println(newu);
	}

}



输出结果:


Marshalled xml==>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><count>2</count><rows><row><id>1</id><name>土豆</name></row><row><id>2</id><name>洋葱</name></row></rows></user>

UnMarshalled user==>

User [count=2, rows=[{1=土豆}, {2=洋葱}]]

2013年9月29日 20:40

相关推荐

    jdk10+ java.lang.NoClassDefFoundError: javax/xml/ws/Service 错误

    jdk升级之后出现异常:java.lang.NoClassDefFoundError: javax/xml/ws/Service 1、解决方案jdk降级至1.8之前 ... &lt;artifactId&gt;jaxb-api&lt;/artifactId&gt; &lt;version&gt;2.3.1&lt;/version&gt; &lt;/dependency&gt; .....

    一个基于java jaxb的序列化例子,非常简单易懂

    一个基于java jaxb的序列化例子,非常简单易懂。jaxb是java标准的序列化方案,实现方式简单,是一种很好用的java xml 序列化反序列化方式

    jaxb-impl-2.3.0.1.jar

    &lt;groupId&gt;com.sun.xml.bind&lt;/groupId&gt; &lt;artifactId&gt;jaxb-impl&lt;/artifactId&gt; &lt;version&gt;2.3.0.1&lt;/version&gt;

    xjc-javadoc-plugin:XJC javadoc插件,基于xsd添加javadocs

    xjc-javadoc-plugin ... &lt;groupId&gt;org.jvnet.jaxb2.maven2&lt;/groupId&gt; &lt;artifactId&gt;maven-jaxb22-plugin&lt;/artifactId&gt; &lt;version&gt;0.12.3&lt;/version&gt; &lt;executions&gt; &lt;execution&gt; &lt;id&gt;xjc&lt;/id&gt; &lt;goals&gt;

    jaxb xml 转map

    jaxb xml 转map

    jaxb-core.rar

    &lt;dependency&gt; &lt;groupId&gt;com.aliyun&lt;/groupId&gt; &lt;artifactId&gt;dysmsapi20170525&lt;/artifactId&gt; &lt;version&gt;2.0.4&lt;/version&gt; &lt;/dependency&gt;

    openapi-jaxb:XSD中的OpenApi注释-> DTO生成

    OpenApi 3插件 目录 问题 4.3。... &lt; groupId&gt;hu.icellmobilsoft.jaxb&lt;/ groupId&gt; &lt; artifactId&gt;openapi-jaxb&lt;/ artifactId&gt; &lt; version&gt;1.1.0&lt;/ version&gt; &lt;/ dependency&gt; 2. openapi-jaxb插件 swa

    xjc-inst:用于实例化的 XJC 插件

    用于实例化的 XJC 插件 该插件使 XJC 能够实例化从 XML-Schemas 生成的类中的字段。... &lt;groupId&gt;org.jvnet.jaxb2.maven2&lt;/groupId&gt; &lt;artifactId&gt;maven-jaxb2-plugin&lt;/artifactId&gt; &lt;version&gt;0.8.1&lt;/version&gt;

    jaxb+list+实体,实现对xml读写

    使用jaxb来实现对xml的读写,其中用到了list整个集合

    tareaJavaXML-JSON_02

    api 2.3.1 &lt;dependency&gt; &lt;groupId&gt;javax.activation&lt;/groupId&gt; &lt;artifactId&gt;activation&lt;/artifactId&gt; &lt;version&gt;1.1&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.glassfish.jaxb&lt;/groupId&gt; &lt;artifactId&gt;jaxb-...

    jaxb xml

    jaxb&lt;br&gt;jaxb

    iFramework:iFramework 是一组围绕 GWT 平台、JAXB 和其他几个知名框架和库的工具和 API,应该有助于减少新的 Web 应用程序开发时间

    &lt; iframework&gt;0.4.0&lt;/ iframework&gt; &lt;/ properties&gt; 依赖项: &lt;!-- GWTP MVP (client-side) extension --&gt; &lt; dependency&gt; &lt; groupId&gt;pro.redsoft.iframework&lt;/ groupId&gt; &lt; artifactId&gt;iframework-gwtpx...

    xml2object、object2xml之JAXB

    前段时间找了好久xml与object之间的转换都没找到!最近在学习WebService,讲到JAXB!没听说过!看了才知道jdk中自带了这个功能,什么这个...List Map 继承 接口 数据类型不一至的一异常 父子类的转换 &lt;&lt;&lt;&lt;---&gt;&gt;&gt;&gt; xml

    martian-framework-jaxb:JAXB的Java框架

    火星框架jaxb 该软件包提供了有用的辅助类,这些... &lt;artifactId&gt;martian-framework-jaxb&lt;/artifactId&gt; &lt;version&gt;21.04.00.00&lt;/version&gt; &lt;/dependency&gt; 执照 根据Apache License 2.0分发。 有关更多信息,请参见。

    JAXB的使用JAXB的使用

    JAXB的使用JAXB的使用JAXB的使用JAXB的使用

    JAXB Unmarshalling @XmlAnyElement

    解决List&lt;Object&gt; 没法转 具体对象问题 SOAP +XML JAXB Unmarshalling @XmlAnyElement

    JAXB(JAXB支持、源码、官方说明文档)

    Please subscribe to the users list and send comments/feedbacks/opinions to the list. Also, bugs that are found in the RI can be reported through the issue tracker. Source Code Download the source ...

    jaxb-api-2.2 jaxb-impl

    2.不是把下载的这个jar文件放在sun网站给出的&lt;java-home&gt;/lib/endorsed 下,而是要自己试验确定应该放在哪个目录下: 确定放在哪个目录下的方法如下: 首先要看你的项目是java项目还是java web项目: A, java项目...

    jaxb-api jaxb-impl jar

    jaxb-api jaxb-impl jar

    JAXB的 eclipse插件

    JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件

Global site tag (gtag.js) - Google Analytics