关于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里面可以对字段定义自己需要的类型,再进行处理。

你可能感兴趣的:(java,c,工作,xml,Nokia)