最近在工作中接到XSD文件转化成XML文件的任务,根据XSD文件里面的定义,在界面上展示所有字段,并由用户填写信息,最后保存在XML文件里面。
*****************************XSD解析成XML******************************
拿到networking.xsd文件,首先要解析成JAVA文件,我使用的是1.6的版本,所以在JAVA的安装目录下面有自带的XJC.EXE文件可以解析,打开“运行”输入cmd命令
c:\Documents and Seeting\Administartor>cd C:\Program Files\Java\jdk1.6.0_13\bin
C:\Program Files\Java\jdk1.6.0_13\bin>xjc networking.xsd
这样就可以解析完成了,生成的Java文件就在bin目录下面;当然我们也可以自己定义生成的package,只需要在命令后面加入package的名字。
注1:有一些xsd文件自己定义了package名字,所以解析以后就按照自己定义的路径生成。
注2:并不是所有的xsd都会生成package-info.java文件。
注3:有一些xsd文件在定义某些字段的type的时候,有可能使用公用的xsd文件,这样就需要把公用的xsd文件也同时移动到bin目录下面。
*************************生成的JAVA文件********************************
在xsd解析成的JAVA文件里面,每个字段都有get/set方法,用于存取数据;有时,根据XSD的定义,有些字段没有get/set方法,使用一个list来存放数据,这个也是可以的,但是在JSP页面展示的时候,会遇到一些问题,因为unmarshal和marshal的时候会检测方法是否存在。
解析networking.xsd以后就有一个Url.java,里面的字段没有get/set方法,和帖子:http://www.iteye.com/problems/50615 一样的, 考虑到每一个elemnt等都要用<id></id>来展示, 我把Url.java里面的字段从
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"content"
})
@XmlRootElement(name = "url")
public class Url {
@XmlElementRefs({
@XmlElementRef(name = "id", type = JAXBElement.class),
@XmlElementRef(name = "Sendcli", type = JAXBElement.class)
})
@XmlMixed
protected List<Serializable> content;
public List<Serializable> getContent() {
if (content == null) {
content = new ArrayList<Serializable>();
}
return this.content;
}
}
修改成
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"Sendcli",
"id"})
@XmlRootElement(name = "url")
public class Url {
@XmlElement(name = "id", type = String.class)
protected String id;
@XmlElement(name = "Sendcli", type = String.class)
protected String Sendcli;
//get set
}
这样处理的话,问题就得到了解决,界面可以存储数据到XML文件里面。
注1:不能迷信XJC的解析,实现XSD就可以
注2:XJC也靠不住,如果数据存储不成功,需要首先测试Java类里面的get/set方法,我就遇到过一个字段叫impStrack 生成的方法却是setIMPStack,getIMPStack; 害的我好找。
**************************关于Adapter的一点介绍*************************
有一些XSD文件定义了某个字段是一个类型的, 如:
<xsd:attribute name="PollingTime" type="cmn:Period" use="required">
<xsd:annotation>
<xsd:documentation>
Define a value for poll the file.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
解析以后就会生成下面的代码:
@XmlAttribute(name = "PollingTime", required = true)
@XmlJavaTypeAdapter(Adapter7 .class)
protected Period pollingTime;
这个就表示pollingTime是一个Period类型的,这个类型是属于Adapter7.java类的,Adapter7.java的内容如下:
public class Adapter7
extends XmlAdapter<String, Period>
{
public Period unmarshal(String value) throws ParseException {
return (com.nokia.warlock.admin.app.web.schema.utils.text.PeriodParser.getPeriod(value));
}
public String marshal(Period value) {
if (value == null) {
return null;
}
return value.toString();
}
}
所以在xsd里面可以对字段定义自己需要的类型,再进行处理。
*****************************XSD解析成XML******************************
拿到networking.xsd文件,首先要解析成JAVA文件,我使用的是1.6的版本,所以在JAVA的安装目录下面有自带的XJC.EXE文件可以解析,打开“运行”输入cmd命令
c:\Documents and Seeting\Administartor>cd C:\Program Files\Java\jdk1.6.0_13\bin
C:\Program Files\Java\jdk1.6.0_13\bin>xjc networking.xsd
这样就可以解析完成了,生成的Java文件就在bin目录下面;当然我们也可以自己定义生成的package,只需要在命令后面加入package的名字。
注1:有一些xsd文件自己定义了package名字,所以解析以后就按照自己定义的路径生成。
注2:并不是所有的xsd都会生成package-info.java文件。
注3:有一些xsd文件在定义某些字段的type的时候,有可能使用公用的xsd文件,这样就需要把公用的xsd文件也同时移动到bin目录下面。
*************************生成的JAVA文件********************************
在xsd解析成的JAVA文件里面,每个字段都有get/set方法,用于存取数据;有时,根据XSD的定义,有些字段没有get/set方法,使用一个list来存放数据,这个也是可以的,但是在JSP页面展示的时候,会遇到一些问题,因为unmarshal和marshal的时候会检测方法是否存在。
解析networking.xsd以后就有一个Url.java,里面的字段没有get/set方法,和帖子:http://www.iteye.com/problems/50615 一样的, 考虑到每一个elemnt等都要用<id></id>来展示, 我把Url.java里面的字段从
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"content"
})
@XmlRootElement(name = "url")
public class Url {
@XmlElementRefs({
@XmlElementRef(name = "id", type = JAXBElement.class),
@XmlElementRef(name = "Sendcli", type = JAXBElement.class)
})
@XmlMixed
protected List<Serializable> content;
public List<Serializable> getContent() {
if (content == null) {
content = new ArrayList<Serializable>();
}
return this.content;
}
}
修改成
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"Sendcli",
"id"})
@XmlRootElement(name = "url")
public class Url {
@XmlElement(name = "id", type = String.class)
protected String id;
@XmlElement(name = "Sendcli", type = String.class)
protected String Sendcli;
//get set
}
这样处理的话,问题就得到了解决,界面可以存储数据到XML文件里面。
注1:不能迷信XJC的解析,实现XSD就可以
注2:XJC也靠不住,如果数据存储不成功,需要首先测试Java类里面的get/set方法,我就遇到过一个字段叫impStrack 生成的方法却是setIMPStack,getIMPStack; 害的我好找。
**************************关于Adapter的一点介绍*************************
有一些XSD文件定义了某个字段是一个类型的, 如:
<xsd:attribute name="PollingTime" type="cmn:Period" use="required">
<xsd:annotation>
<xsd:documentation>
Define a value for poll the file.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
解析以后就会生成下面的代码:
@XmlAttribute(name = "PollingTime", required = true)
@XmlJavaTypeAdapter(Adapter7 .class)
protected Period pollingTime;
这个就表示pollingTime是一个Period类型的,这个类型是属于Adapter7.java类的,Adapter7.java的内容如下:
public class Adapter7
extends XmlAdapter<String, Period>
{
public Period unmarshal(String value) throws ParseException {
return (com.nokia.warlock.admin.app.web.schema.utils.text.PeriodParser.getPeriod(value));
}
public String marshal(Period value) {
if (value == null) {
return null;
}
return value.toString();
}
}
所以在xsd里面可以对字段定义自己需要的类型,再进行处理。