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=洋葱}]]
相关推荐
Map<String, String> result = new HashMap<>(); NodeList nodeList = root.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == ...
当我们需要在Web服务中传递复杂对象,如List、Map或List<Map>时,可以使用Java的序列化机制。在CXF中,可以通过JAXB(Java Architecture for XML Binding)将Java对象转换为XML格式,以便在网络间传输。例如,如果你...
List<Map<String, Object>> dataList = new ArrayList<>(); for (Element dataElement : rootElement.elements("data")) { Map<String, Object> dataMap = new HashMap<>(); for (Element element : data...
public void processMap(@WebParam(name = "mapData") @XmlJavaTypeAdapter(MapAdapter.class) Map<String, Object> map) { // ...处理Map的逻辑... } ``` 6. **客户端测试** - 描述中提到客户端使用反射来构造`...
public class MapAdapter extends XmlAdapter<AdaptedMap, Map> { @Overridepublic AdaptedMap marshal(Map map) throws Exception { if (map == null) { return null; } AdaptedMap adaptedMap = new AdaptedMap();...
private Map<String, Double> grades; // 成绩以科目为键,分数为值 // 构造函数、getters和setters } ``` 接着,我们可以创建一个成绩管理类(GradeManager)来处理学生的成绩信息。这个类可以包含如下方法: ...
Map<String, String> map = new HashMap<>(); map.put("key1", "value1"); map.put("key2", "value2"); String jsonString = JSONObject.fromObject(map).toString(); // 反序列化:将JSON字符串转换为Java对象 ...
- `doc2String()`方法(未在代码中显示)应该是将`Document`对象转换为字符串的方法,通常会使用`OutputFormat`和`XMLWriter`来格式化输出的XML字符串。 3. **XML到List转换**: - `listtoXml()`方法类似地将List...
例如,如果`<person>`节点下有多个`<address>`子节点,我们可以定义一个`List<Address> addressList`字段来存储。在解析时,遍历`<address>`节点,创建对应的`Address`对象并添加到列表中。 另一方面,从实体类转...
- `parseArray(String jsonString, Class<T> clazz)`: 解析JSON数组字符串,并转换为指定类型的List集合。 - `toJavaList(JSONArray jsonArray, Class<T> clazz)`: 将JSONArray转换为指定类型的List。 3. ...
public void xmlToMap(Element element, Map<String, Object> map) { // 遍历属性 NamedNodeMap attributes = element.getAttributes(); for (int i = 0; i < attributes.getLength(); i++) { Node attr = ...
public void addChild(String parentNodeName, String newNodeName, String childNodeName, String text, Map<String, String> attributesMap) { Element parent = document.getRootElement().element...
private static Map<String, Room> rooms; // Initialize the HashMap with some sample data public static void addRoom(Room room) { rooms.put(room.getId(), room); } // ... deleteRoom, updateRoom, ...
与JAXB等其他框架相比,Jibx允许更精细的控制序列化和反序列化过程,比如可以通过XML绑定文件自定义序列化行为。然而,这也意味着使用Jibx需要更多的配置工作,例如生成绑定文件和对应的jar文件。 总结一下,Jibx是...
Apache CXF入门范例以及对传递ListMap类型的疑惑】中,可能会详细解释如何创建和调用一个使用CXF的Web服务,同时也可能讨论了在处理复杂数据类型如List<Map<String, Object>>时遇到的问题和解决方案。通常,CXF允许...
开发者可以通过实现`JsonSerializer<T>`和`JsonDeserializer<T>`接口来自定义序列化和反序列化的逻辑。 5. **序列化策略**:Gson提供了多种序列化策略,如忽略null字段、控制字段可见性等,以满足不同的需求。这些...
Map<String, Object> data = new HashMap<>(); data.put("items", Arrays.asList(new Item("Sample Name"))); // 输出XML StringWriter writer = new StringWriter(); template.process(data, writer); FileUtils....
项目中可能会有处理泛型类型的示例,例如`List<T>`或`Map<String, T>`。 7. **自定义序列化和反序列化逻辑**:通过实现`JsonbAdapter`接口,开发者可以定义自定义的序列化和反序列化逻辑,以处理特定的Java类型或...
8. **泛型**:自Java 5引入,泛型增强了类型安全,减少了类型转换的必要性,如`List<String>`。 9. **枚举**:Java 5引入的新特性,允许创建不可变的、有限的常量集合,提供了比常量更强大的功能。 10. **注解...