用XML文件直接生成点.java文件
对于用Jaxb解析xml的同行来说,这是个很好用的工具,我用了大约有3个月,省了不少工作量,一直自私没有分享,现在看网上有类似的文章出现,但是不够详细,我就分享一下用的效果。
在用Jaxb解析xml的时候,需要写好多javabean,并且各bean之间是有一定关系的,一旦xml文件结构比较复杂或者字段比较多时,做的工作会很无聊,而且容易出错,那就用工具来做吧。
首先,下载附件中的trang.jar包。放在任意文件夹中,我放在了C:\In中。同时把要转换的zhaoyx.xml文件也放在该文件夹中。建立生成.java文件的包zhaoyx。如图:
其次,win+R打开运行窗口,cmd进去,切换到C:\In目录下。
执行:java -jar trang.jar zhaoyx.xml zhaoyx.xsd 命令,执行后,如图:
在C:\In目录下多了zhaoyx.xsd文件
再次,在运行窗口执行xjc -p zhaoyx zhaoyx.xsd 命令行,然后就开始解析和生成java了,如下图:
在C:\In目录下就多了生成的javabean
最后,修改这些javabean,生成javabean是xml文件的一个结构映射,工具不是非常智能,一些特殊情况,需要手工改。下面说一下常用的修改。
1、终结点有时候生成的不是基本类型,如我生成的CAGENT.java代码中有SERIALNO.java型变量,但这个节点是<SERIALNO></SERIALNO>,显然这个类型是多余的,我把它改成String型,多余的类删掉即可。
2、生成<STARTDATE class="sql-date">2012-09-14</STARTDATE>节点的类不能用,需要删掉STARTDATE类,自己添加StartDate类,代码如下:
package zhaoyx;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "startdate")
public class StartDate {
@XmlAttribute(name = "class")
private String className;
@XmlValue
private String value;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
在Jaxb转换xml前,为对象设值,需要
packet.getBussdocinfo().getStartdate().setClassName("sql-date");
packet.getBussdocinfo().getStartdate().setValue("2012-09-14");
3、设计到List集合行的成员变量时需要手工修改,下面是个改好的java类,可以参考
package zhaoyx;
import java.util.List;
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.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"sumclause"
})
@XmlRootElement(name = "sumclauselist")
public class Sumclauselist {
@XmlElement(required = true)
protected List<Sumclause> sumclause;
public List<Sumclause> getSumclause() {
return sumclause;
}
public void setSumclause(List<Sumclause> value) {
this.sumclause = value;
}
}
生成的时候,这里不会是List类型。