Castor-解析xml的另外一种方法
众所周知,xml解析一般有SAX和DOM两种方式。
SAX是基于事件驱动的行解析,具有速度快,占用内存小的优点,但是实现麻烦,代码可读性较差。
DOM是基于树状结构的解析,也就是其将整个xml文档看作一棵树,然后按照不同的分支/节点解析,更具面向对象的风格。缺点就是其需要将整个xml读到内存中,所以占用内存较多,而且比较慢。
实际应用中,很多场景是:程序将xml中的数据解析出来后,然后生成一些java对象来保持这些数据。于是需要在代码中频繁调用创建对象、get/set等的代码。
0.下面是一个使用DOM解析文档的例子。
Address.java
- /**
- *
- */
- package com.hayden.model;
- /**
- * @author HaydenWang
- *
- */
- public class Address implements java.io.Serializable {
- private static final long serialVersionUID = 1863183127959586043L;
- private Long id;
- private String detail;
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getDetail() {
- return detail;
- }
- public void setDetail(String detail) {
- this.detail = detail;
- }
- @Override
- public String toString() {
- return "Address [detail=" + detail + ", id=" + id + "]";
- }
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((detail == null) ? 0 : detail.hashCode());
- result = prime * result + ((id == null) ? 0 : id.hashCode());
- return result;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- Address other = (Address) obj;
- if (detail == null) {
- if (other.detail != null)
- return false;
- } else if (!detail.equals(other.detail))
- return false;
- if (id == null) {
- if (other.id != null)
- return false;
- } else if (!id.equals(other.id))
- return false;
- return true;
- }
- }
/** * */ package com.hayden.model; /** * @author HaydenWang * */ public class Address implements java.io.Serializable { private static final long serialVersionUID = 1863183127959586043L; private Long id; private String detail; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } @Override public String toString() { return "Address [detail=" + detail + ", id=" + id + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((detail == null) ? 0 : detail.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Address other = (Address) obj; if (detail == null) { if (other.detail != null) return false; } else if (!detail.equals(other.detail)) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }
User.java
- /**
- *
- */
- package com.hayden.model;
- import java.util.Date;
- /**
- * @author HaydenWang
- *
- */
- public class User {
- private Long id;
- private String name;
- private Address address;
- private Date createDate;
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Address getAddress() {
- return address;
- }
- public void setAddress(Address address) {
- this.address = address;
- }
- public Date getCreateDate() {
- return createDate;
- }
- public void setCreateDate(Date createDate) {
- this.createDate = createDate;
- }
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((address == null) ? 0 : address.hashCode());
- result = prime * result
- + ((createDate == null) ? 0 : createDate.hashCode());
- result = prime * result + ((id == null) ? 0 : id.hashCode());
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- return result;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- User other = (User) obj;
- if (address == null) {
- if (other.address != null)
- return false;
- } else if (!address.equals(other.address))
- return false;
- if (createDate == null) {
- if (other.createDate != null)
- return false;
- } else if (!createDate.equals(other.createDate))
- return false;
- if (id == null) {
- if (other.id != null)
- return false;
- } else if (!id.equals(other.id))
- return false;
- if (name == null) {
- if (other.name != null)
- return false;
- } else if (!name.equals(other.name))
- return false;
- return true;
- }
- @Override
- public String toString() {
- return "User [address=" + address + ", createDate=" + createDate
- + ", id=" + id + ", name=" + name + "]";
- }
- }
/** * */ package com.hayden.model; import java.util.Date; /** * @author HaydenWang * */ public class User { private Long id; private String name; private Address address; private Date createDate; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((address == null) ? 0 : address.hashCode()); result = prime * result + ((createDate == null) ? 0 : createDate.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (address == null) { if (other.address != null) return false; } else if (!address.equals(other.address)) return false; if (createDate == null) { if (other.createDate != null) return false; } else if (!createDate.equals(other.createDate)) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public String toString() { return "User [address=" + address + ", createDate=" + createDate + ", id=" + id + ", name=" + name + "]"; } }
Domparser.java
- /**
- *
- */
- package com.hayden.dom;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.apache.log4j.Logger;
- import org.w3c.dom.Document;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- import com.hayden.castor.XmlUtil;
- import com.hayden.model.Address;
- import com.hayden.model.User;
- /**
- * @author HaydenWang
- *
- */
- public class DomParser {
- private static final Logger logger = Logger.getLogger(DomParser.class);
- private static final String FORMAT = "yyyy-MM-dd";
- public User parseUser(String fileName) {
- Document doc = XmlUtil.getDocumentFromFile(fileName);
- Node node = doc.getFirstChild();
- User user = new User();
- if ("user".equals(node.getNodeName())) {
- NodeList childNodes = node.getChildNodes();
- int length = childNodes.getLength();
- for (int i = 0; i < length; i++) {
- Node subNode = childNodes.item(i);
- String nodeName = subNode.getNodeName();
- if ("address".equals(nodeName)) {// this is address node
- Address addr = parseAddress(subNode);
- user.setAddress(addr);
- } else if ("name".equals(nodeName)) { // this is name node
- String userName = getNodeValue(subNode);
- user.setName(userName);
- } else if ("id".equals(nodeName)) {
- String idString = getNodeValue(subNode);
- user.setId(Long.parseLong(idString));
- }else if("create-date".equals(nodeName)){
- String dateString = getNodeValue(subNode);
- Date date = parseDate(dateString);
- user.setCreateDate(date);
- }
- }
- }
- return user;
- }
- private Address parseAddress(Node addrNode) {
- Address addr = new Address();
- NodeList nodeList = addrNode.getChildNodes();
- int length = nodeList.getLength();
- for (int i = 0; i < length; i++) {
- Node node = nodeList.item(i);
- String nodeName = node.getNodeName();
- if ("id".equals(nodeName)) {
- String idString = getNodeValue(node);
- addr.setId(Long.parseLong(idString));
- } else if ("details".equals(nodeName)) {
- addr.setDetail(getNodeValue(node));
- }
- }
- return addr;
- }
- /**
- * get the value for the node with format <name>helen</name>
- *
- * @param node
- * @return
- */
- private String getNodeValue(Node node) {
- String nodeValue = null;
- if (null != node) {
- NodeList childNodeList = node.getChildNodes();
- if (childNodeList != null) {
- for (int i = 0, j = childNodeList.getLength(); i < j; i++) {
- Node currentNode = childNodeList.item(i);
- nodeValue = currentNode.getNodeValue();
- break;
- }
- } else {
- logger.debug("The node is empty");
- }
- logger.debug(" The nodeName: " + node.getNodeName()
- + ", and the value: " + nodeValue);
- } else {
- logger.warn("The node is null, so can't take its value");
- }
- return nodeValue;
- }
- private static final Date parseDate(String input){
- SimpleDateFormat formatter = new SimpleDateFormat(FORMAT);
- Date date = null;
- try {
- date = formatter.parse((String) input);
- } catch (ParseException px) {
- throw new IllegalArgumentException(px.getMessage());
- }
- return date;
- }
- }
/** * */ package com.hayden.dom; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.hayden.castor.XmlUtil; import com.hayden.model.Address; import com.hayden.model.User; /** * @author HaydenWang * */ public class DomParser { private static final Logger logger = Logger.getLogger(DomParser.class); private static final String FORMAT = "yyyy-MM-dd"; public User parseUser(String fileName) { Document doc = XmlUtil.getDocumentFromFile(fileName); Node node = doc.getFirstChild(); User user = new User(); if ("user".equals(node.getNodeName())) { NodeList childNodes = node.getChildNodes(); int length = childNodes.getLength(); for (int i = 0; i < length; i++) { Node subNode = childNodes.item(i); String nodeName = subNode.getNodeName(); if ("address".equals(nodeName)) {// this is address node Address addr = parseAddress(subNode); user.setAddress(addr); } else if ("name".equals(nodeName)) { // this is name node String userName = getNodeValue(subNode); user.setName(userName); } else if ("id".equals(nodeName)) { String idString = getNodeValue(subNode); user.setId(Long.parseLong(idString)); }else if("create-date".equals(nodeName)){ String dateString = getNodeValue(subNode); Date date = parseDate(dateString); user.setCreateDate(date); } } } return user; } private Address parseAddress(Node addrNode) { Address addr = new Address(); NodeList nodeList = addrNode.getChildNodes(); int length = nodeList.getLength(); for (int i = 0; i < length; i++) { Node node = nodeList.item(i); String nodeName = node.getNodeName(); if ("id".equals(nodeName)) { String idString = getNodeValue(node); addr.setId(Long.parseLong(idString)); } else if ("details".equals(nodeName)) { addr.setDetail(getNodeValue(node)); } } return addr; } /** * get the value for the node with format <name>helen</name> * * @param node * @return */ private String getNodeValue(Node node) { String nodeValue = null; if (null != node) { NodeList childNodeList = node.getChildNodes(); if (childNodeList != null) { for (int i = 0, j = childNodeList.getLength(); i < j; i++) { Node currentNode = childNodeList.item(i); nodeValue = currentNode.getNodeValue(); break; } } else { logger.debug("The node is empty"); } logger.debug(" The nodeName: " + node.getNodeName() + ", and the value: " + nodeValue); } else { logger.warn("The node is null, so can't take its value"); } return nodeValue; } private static final Date parseDate(String input){ SimpleDateFormat formatter = new SimpleDateFormat(FORMAT); Date date = null; try { date = formatter.parse((String) input); } catch (ParseException px) { throw new IllegalArgumentException(px.getMessage()); } return date; } }
通过上面的代码可以看出,有很多重复性的体力活(频繁判断节点的内容,然后set到对象中),而且当我们需要给这些对象增加或者修改一些属性的时候,就需要修改解析xml的程序。
那么是否有工具可以帮助实现这些事情呢?这就是Castor等Xml-Object mapping的工具做的事情。
Castor中有两个核心的操作:
- marshaller:将对象转换成xml
- unmarshaller: 从xml中解析并且生成java对象。
下面分别看看Castor在几种不同场景下的使用。
<!--[if !supportLists]-->1. <!--[endif]-->默认情况下,Castor会自动扫描类中的set/get方法,会自动将该属性和xml中的节点对应起来。如果属性不是String类型,在marshaller的时候将调用其toString()方法,同样在unmarshaller的时候,也会自动将其转型到所需类型。下面是一个使用Castor默认配置的例子。
- /**
- *
- */
- package com.hayden.castor;
- import static org.junit.Assert.fail;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.util.Date;
- import org.exolab.castor.xml.Marshaller;
- import org.exolab.castor.xml.Unmarshaller;
- import org.junit.Assert;
- import org.junit.Before;
- import org.junit.Test;
- import com.hayden.model.Address;
- import com.hayden.model.User;
- /**
- * @author HaydenWang
- *
- */
- public class SimpletestCastor {
- private User user;
- @Before
- public void init() {
- Address addr = new Address();
- addr.setId(100l);
- addr.setDetail("Baidu Building");
- user = new User();
- user.setId(1111L);
- user.setName("Helen");
- user.setAddress(addr);
- user.setCreateDate(new Date());
- }
- @Test
- public void simpleTest() {
- try {
- FileWriter writer = new FileWriter("simpleTest.xml");
- Marshaller.marshal(user, writer);
- // Create a Reader to the file to unmarshal from
- FileReader reader = new FileReader("simpleTest.xml");
- // Marshal the user object
- User userFromXml = (User) Unmarshaller.unmarshal(User.class, reader);
- System.out.println(userFromXml);
- Assert.assertEquals(user, userFromXml);
- } catch (Exception e) {
- e.printStackTrace();
- fail(e.getMessage());
- }
- }
- }
/** * */ package com.hayden.castor; import static org.junit.Assert.fail; import java.io.FileReader; import java.io.FileWriter; import java.util.Date; import org.exolab.castor.xml.Marshaller; import org.exolab.castor.xml.Unmarshaller; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.hayden.model.Address; import com.hayden.model.User; /** * @author HaydenWang * */ public class SimpletestCastor { private User user; @Before public void init() { Address addr = new Address(); addr.setId(100l); addr.setDetail("Baidu Building"); user = new User(); user.setId(1111L); user.setName("Helen"); user.setAddress(addr); user.setCreateDate(new Date()); } @Test public void simpleTest() { try { FileWriter writer = new FileWriter("simpleTest.xml"); Marshaller.marshal(user, writer); // Create a Reader to the file to unmarshal from FileReader reader = new FileReader("simpleTest.xml"); // Marshal the user object User userFromXml = (User) Unmarshaller.unmarshal(User.class, reader); System.out.println(userFromXml); Assert.assertEquals(user, userFromXml); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } }
<!--[if !supportLists]-->2. <!--[endif]-->当默认的mapping不能满足要求时,比如有的时候我们可能需要去节点的某个属性的值map到对象的属性,有的时候则是将某个节点的值map到对象的属性,这个时候我们就需要自己定义mapping文件。
userMapping.xml
- <?xml version="1.0"?>
- <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" "http://castor.org/mapping.dtd">
- <mapping>
- <class name="com.hayden.model.Address">
- <map-to xml="address" />
- <field name="id" type="java.lang.Long">
- <bind-xml name="id" node="element" />
- </field>
- <field name="detail" type="java.lang.String">
- <bind-xml name="detail" node="element" />
- </field>
- </class>
- <class name="com.hayden.model.User">
- <map-to xml="user" />
- <field name="id" type="java.lang.Long">
- <bind-xml name="id" node="element" />
- </field>
- <field name="name" type="java.lang.String">
- <bind-xml name="name" node="element" />
- </field>
- <field name="address" type="com.hayden.model.Address">
- <bind-xml name="address" node="element" />
- </field>
- <field name="type" type="java.lang.Integer">
- <bind-xml name="type" node="element" />
- </field>
- </class>
- </mapping>
<?xml version="1.0"?> <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" "http://castor.org/mapping.dtd"> <mapping> <class name="com.hayden.model.Address"> <map-to xml="address" /> <field name="id" type="java.lang.Long"> <bind-xml name="id" node="element" /> </field> <field name="detail" type="java.lang.String"> <bind-xml name="detail" node="element" /> </field> </class> <class name="com.hayden.model.User"> <map-to xml="user" /> <field name="id" type="java.lang.Long"> <bind-xml name="id" node="element" /> </field> <field name="name" type="java.lang.String"> <bind-xml name="name" node="element" /> </field> <field name="address" type="com.hayden.model.Address"> <bind-xml name="address" node="element" /> </field> <field name="type" type="java.lang.Integer"> <bind-xml name="type" node="element" /> </field> </class> </mapping>
CastorMappingTest.java
- /**
- *
- */
- package com.hayden.castor;
- import static org.junit.Assert.fail;
- import java.io.FileReader;
- import java.io.FileWriter;
- import org.exolab.castor.mapping.Mapping;
- import org.exolab.castor.xml.Marshaller;
- import org.exolab.castor.xml.Unmarshaller;
- import org.junit.Assert;
- import org.junit.Before;
- import org.junit.Test;
- import com.hayden.model.Address;
- import com.hayden.model.User;
- /**
- * @author HaydenWang
- *
- */
- public class CastorMappingTest {
- private User user;
- @Before
- public void init() {
- Address addr = new Address();
- addr.setId(100l);
- addr.setDetail("Baidu Building");
- user = new User();
- user.setId(1111L);
- user.setName("Helen");
- user.setAddress(addr);
- user.setType(User.TYPE_COMMON_USER);
- }
- @Test
- public void mappingTest() {
- try { // Load Mapping
- Mapping mapping = new Mapping();
- mapping.loadMapping("file:conf//userMapping.xml");
- Marshaller marshaller = new Marshaller();
- marshaller.setMapping(mapping);
- FileWriter writer = new FileWriter("out//userMappingTest.xml");
- marshaller.setWriter(writer);
- marshaller.marshal(user);
- // Create a Reader to the file to unmarshal from
- FileReader reader = new FileReader("out//userMappingTest.xml");
- // Create a new Unmarshaller
- Unmarshaller unmarshaller = new Unmarshaller(mapping);
- unmarshaller.setClass(User.class);
- // Unmarshal the user object
- User userFromXml = (User) unmarshaller.unmarshal(reader);
- System.out.println(userFromXml);
- Assert.assertEquals(user, userFromXml);
- } catch (Exception e) {
- e.printStackTrace();
- fail(e.getMessage());
- }
- }
- }
/** * */ package com.hayden.castor; import static org.junit.Assert.fail; import java.io.FileReader; import java.io.FileWriter; import org.exolab.castor.mapping.Mapping; import org.exolab.castor.xml.Marshaller; import org.exolab.castor.xml.Unmarshaller; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.hayden.model.Address; import com.hayden.model.User; /** * @author HaydenWang * */ public class CastorMappingTest { private User user; @Before public void init() { Address addr = new Address(); addr.setId(100l); addr.setDetail("Baidu Building"); user = new User(); user.setId(1111L); user.setName("Helen"); user.setAddress(addr); user.setType(User.TYPE_COMMON_USER); } @Test public void mappingTest() { try { // Load Mapping Mapping mapping = new Mapping(); mapping.loadMapping("file:conf//userMapping.xml"); Marshaller marshaller = new Marshaller(); marshaller.setMapping(mapping); FileWriter writer = new FileWriter("out//userMappingTest.xml"); marshaller.setWriter(writer); marshaller.marshal(user); // Create a Reader to the file to unmarshal from FileReader reader = new FileReader("out//userMappingTest.xml"); // Create a new Unmarshaller Unmarshaller unmarshaller = new Unmarshaller(mapping); unmarshaller.setClass(User.class); // Unmarshal the user object User userFromXml = (User) unmarshaller.unmarshal(reader); System.out.println(userFromXml); Assert.assertEquals(user, userFromXml); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } }
<!--[if !supportLists]-->3. <!--[endif]-->以上的例子都是直接将xml中的值赋给对象的属性,可是有的时候,我们需要将这些值进行包装。如上面例子中的用户的type属性,在代码中是Long类型,可是我们希望在xml中是有意义的字符,如对于type为1的时候,输出“admin”。对于这种情况,这个时候我们就需要写一些FieldHandler来解决这类问题。
UserTypeHandler.java
- package com.hayden.castor;
- import org.exolab.castor.mapping.GeneralizedFieldHandler;
- import com.hayden.model.User;
- public class UserTypeHandler extends GeneralizedFieldHandler {
- @Override
- public Object convertUponGet(Object value) {
- Long type = (Long) value;
- if (User.TYPE_ADMIN.equals(type)) {
- return "admin";
- } else {
- return "common user";
- }
- }
- @Override
- public Object convertUponSet(Object value) {
- String typeString = (String) value;
- if ("admin".equals(typeString)) {
- return User.TYPE_ADMIN;
- } else {
- return User.TYPE_COMMON_USER;
- }
- }
- @Override
- public Class getFieldType() {
- return Long.class;
- }
- }
package com.hayden.castor; import org.exolab.castor.mapping.GeneralizedFieldHandler; import com.hayden.model.User; public class UserTypeHandler extends GeneralizedFieldHandler { @Override public Object convertUponGet(Object value) { Long type = (Long) value; if (User.TYPE_ADMIN.equals(type)) { return "admin"; } else { return "common user"; } } @Override public Object convertUponSet(Object value) { String typeString = (String) value; if ("admin".equals(typeString)) { return User.TYPE_ADMIN; } else { return User.TYPE_COMMON_USER; } } @Override public Class getFieldType() { return Long.class; } }
fieldHandlerMapping.xml
- <?xml version="1.0"?>
- <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" "http://castor.org/mapping.dtd">
- <mapping>
- <class name="com.hayden.model.Address">
- <map-to xml="address" />
- <field name="id" type="java.lang.Long">
- <bind-xml name="id" node="element" />
- </field>
- <field name="detail" type="java.lang.String">
- <bind-xml name="detail" node="element" />
- </field>
- </class>
- <class name="com.hayden.model.User">
- <map-to xml="user" />
- <field name="id" type="java.lang.Long">
- <bind-xml name="id" node="element" />
- </field>
- <field name="name" type="java.lang.String">
- <bind-xml name="name" node="element" />
- </field>
- <field name="address" type="com.hayden.model.Address">
- <bind-xml name="address" node="element" />
- </field>
- <field name="type" type="java.lang.String" handler="com.hayden.castor.UserTypeHandler">
- <bind-xml name="type" node="element" />
- </field>
- </class>
- </mapping>
<?xml version="1.0"?> <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" "http://castor.org/mapping.dtd"> <mapping> <class name="com.hayden.model.Address"> <map-to xml="address" /> <field name="id" type="java.lang.Long"> <bind-xml name="id" node="element" /> </field> <field name="detail" type="java.lang.String"> <bind-xml name="detail" node="element" /> </field> </class> <class name="com.hayden.model.User"> <map-to xml="user" /> <field name="id" type="java.lang.Long"> <bind-xml name="id" node="element" /> </field> <field name="name" type="java.lang.String"> <bind-xml name="name" node="element" /> </field> <field name="address" type="com.hayden.model.Address"> <bind-xml name="address" node="element" /> </field> <field name="type" type="java.lang.String" handler="com.hayden.castor.UserTypeHandler"> <bind-xml name="type" node="element" /> </field> </class> </mapping>
FieldHandlerMappingTest.java
- /**
- *
- */
- package com.hayden.castor;
- import static org.junit.Assert.fail;
- import java.io.FileReader;
- import java.io.FileWriter;
- import org.exolab.castor.mapping.Mapping;
- import org.exolab.castor.xml.Marshaller;
- import org.exolab.castor.xml.Unmarshaller;
- import org.junit.Assert;
- import org.junit.Before;
- import org.junit.Test;
- import com.hayden.model.Address;
- import com.hayden.model.User;
- /**
- * @author HaydenWang
- *
- */
- public class FieldHandlerMappingTest {
- private User user;
- @Before
- public void init() {
- Address addr = new Address();
- addr.setId(100l);
- addr.setDetail("Baidu Building");
- user = new User();
- user.setId(1111L);
- user.setName("Helen");
- user.setAddress(addr);
- user.setType(User.TYPE_COMMON_USER);
- }
- @Test
- public void mappingTest() {
- try { // Load Mapping
- Mapping mapping = new Mapping();
- mapping.loadMapping("file:conf//fieldHandlerMapping.xml");
- Marshaller marshaller = new Marshaller();
- marshaller.setMapping(mapping);
- FileWriter writer = new FileWriter("out//fieldHandlerTest.xml");
- marshaller.setWriter(writer);
- marshaller.marshal(user);
- // Create a Reader to the file to unmarshal from
- FileReader reader = new FileReader("out//fieldHandlerTest.xml");
- // Create a new Unmarshaller
- Unmarshaller unmarshaller = new Unmarshaller(mapping);
- unmarshaller.setClass(User.class);
- // Unmarshal the user object
- User userFromXml = (User) unmarshaller.unmarshal(reader);
- System.out.println(userFromXml);
- Assert.assertEquals(user, userFromXml);
- } catch (Exception e) {
- e.printStackTrace();
- fail(e.getMessage());
- }
- }
- }
/** * */ package com.hayden.castor; import static org.junit.Assert.fail; import java.io.FileReader; import java.io.FileWriter; import org.exolab.castor.mapping.Mapping; import org.exolab.castor.xml.Marshaller; import org.exolab.castor.xml.Unmarshaller; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.hayden.model.Address; import com.hayden.model.User; /** * @author HaydenWang * */ public class FieldHandlerMappingTest { private User user; @Before public void init() { Address addr = new Address(); addr.setId(100l); addr.setDetail("Baidu Building"); user = new User(); user.setId(1111L); user.setName("Helen"); user.setAddress(addr); user.setType(User.TYPE_COMMON_USER); } @Test public void mappingTest() { try { // Load Mapping Mapping mapping = new Mapping(); mapping.loadMapping("file:conf//fieldHandlerMapping.xml"); Marshaller marshaller = new Marshaller(); marshaller.setMapping(mapping); FileWriter writer = new FileWriter("out//fieldHandlerTest.xml"); marshaller.setWriter(writer); marshaller.marshal(user); // Create a Reader to the file to unmarshal from FileReader reader = new FileReader("out//fieldHandlerTest.xml"); // Create a new Unmarshaller Unmarshaller unmarshaller = new Unmarshaller(mapping); unmarshaller.setClass(User.class); // Unmarshal the user object User userFromXml = (User) unmarshaller.unmarshal(reader); System.out.println(userFromXml); Assert.assertEquals(user, userFromXml); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } }
以上只是Castor的基本使用方法。
更多请参见:
http://www.castor.org/
此外,sun的xerecs具有类似的功能。
转载于:https://my.oschina.net/u/175660/blog/55924
Castor-解析xml的另外一种方法相关推荐
- 解析xml文件的几种方法和原理
第一种方法 对象模型 API 定义了层次化对象模型来表示 XML 文档.换句话说,对应 XML 语法中的每个概念定义相应的类:元素.属性.实体.文档.解析器读入 XML 文档的时候,建立 XML 语法 ...
- java处理解析xml文件的几种方法及每种方法的区别
文章目录 了解xml xml文件的结构 **特殊处理** **CDATA** 强烈建议 处理xml文件的几种方式 认识Document对象 解析xml文档 该选择哪种方式解析 DOM解析xml文件 D ...
- 使用DOM4J解析XML文件的两种方法
import java.io.File; import java.util.Iterator; import java.util.List; import org.dom4j.Document; ...
- java构造和解析json_Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
- java json解析 代码_Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
- Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
- PHP怎么读写XML?(四种方法)
PHP怎么读写XML?(四种方法) 一.总结 1.这四种方法中,字符串的方式是最原始的方法.SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内 ...
- java构建json_Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
- Python爬虫入门之爬虫解析提取数据的四种方法
本文主要介绍了Python爬虫入门之爬虫解析提取数据的四种方法,通过具体的内容向大家展现,希望对大家Python爬虫的学习有所帮助. 基础爬虫的固定模式 笔者这里所谈的基础爬虫,指的是不需要处理像异步 ...
- pythonxml解析拿到控件坐标_Python解析xml中dom元素的方法
本文实例讲述了Python解析xml中dom元素的方法.共享给大家供大家参考.详细实现方法如下: 复制代码 代码如下: from xml.dom import minidom try: xmlfile ...
最新文章
- excel打不开怎么修复_SD卡坏了怎么办?一招教你拯救文件!
- k8s 自定义dns_K8S 生态周报| Docker v19.03.10 正式发布
- 每日一皮:男性同胞,是时候反击了!
- Linux shell运行py文件提示command not found
- 三个步骤分析网站优化程度
- Linux (x86) Exploit 开发系列教程之七 绕过 ASLR -- 第二部分
- 转载:使用 GNU Libtool 创建库
- Net5 已经来临,让我来送你一个成功
- sensei鼠标测试软件,'黑科技'传感器打造出的FPS利器 - 赛睿Sensei 310 鼠标
- python的作用域 gbel_[ python ] 全局和局部作用域变量的引用
- 说明使用tc编程的一般步骤 c语言,TC编程手册详解-完整版.doc
- 5.5 卷积、卷积定理和傅里叶变换的关系及其性质
- VS编译器的简单操作
- viper4android蓝牙耳机,蝰蛇音效app下载-蝰蛇音效官方版(ViPER4Android FX)下载v2.7.1.0 安卓版-单机手游网...
- 腾讯 信鸽测试demo
- ec6108v9a精简刷机包_华为悦盒无安装限制固件下载|华为悦盒EC6108V9A第三方精简流畅无安装限制固件 下载 - 巴士下载站...
- RuoYi-flowable工作流管理
- SDUT 3386 小雷的冰茶几
- (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
- 数据库安全性 --- 控制
热门文章
- 从空间分布、空间关系、空间演化、属性数据的扩展与再分析、数据分析扩展的角度举例分析GIS空间分析的特点与重要性,并且写出一句宣传GIS空间分析的广告语
- oracle adg 人工干预,ORACLE 12C ADG 之十四 (ADG PDB级闪回(Flashback PDB))
- 数据库原理与应用实验指导书 实验一:熟悉SQL Server 2012数据库管理系统
- Floyd算法 Java实现
- java 滤波算法_双边滤波算法
- GB/T2828.1-2003与GB/T2828-1987的差异(转载)
- AutoCAD 2008中文版标准教程(第2版)
- 图解 K8S(07):调度利器之亲和与反亲和(服务容灾)
- go语言基础精修(尚硅谷笔记)
- c++中gets用法总结