关于XSD的解析以及在工作中遇到的问题

最近在工作中接到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里面可以对字段定义自己需要的类型,再进行处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值