Java解析XML的一种数据绑定技术
2012-01-15刘平
刘平
(西安财经学院 信息与教育技术中心,陕西 西安 710061)
在跨平台的Web技术应用中,XML[1]技术占据着非常重要的地位,如不同系统之间的数据交互,同一系统各模块之间实现松耦合[2],如果没有XML技术的支持,要做好软件技术开发是很难想象的。对于应用层软件开发人员来讲,遇到的主要技术困难就是跨平台,因为他们所用的开发平台大都各自成为完整的体系,而且系统大都集成了各种插件。下面通过处理 “学生基本信息”这一实例系统地论述跨平台地XML与Java绑定技术和方法。
1 创建图形化的XSM文件
根据对学生基本信息的分析,可以建立描述学生基本信息的可视化XSM文件,如图1所示。
2 创建XSD文件
接下来将XSM图形文件转换成XSD[3](XML Schema)模板文件,名为:XMLStudents.XSD,转换后的内容如下:
3 将XSD文件的各元素与Java类绑定
下一步根据XMLStudents.XSD文件的内容,创建相应的Java类[4]:XmlStudents.Java、XMLStudent.java 和 XmlStudentType.java文件,实现解析功能主要代码分别如下:
1)XmlStudents.Java
该文件中主要创建对整个XML文件的元素节点操作的类,以及操作每个元素节点的增删方法和读存节点数据值的方法,需要引进的类如下:
java.io.*,import java.util*,org.exolab.castor.xml.*,import org.xml.sax.ContentHandler;
/********创建XmlStudents类主要代码***********/
public class XmlStudents implements java.io.Serializable{
private java.util.Vector_XMLStudentList;
public XmlStudents() {super(); _XMLStudentList=new Vector();}//构造方法
//--添加节点方法
public void addXMLStudent(xsd.XMLStudent vXMLStudent)
throws java.lang.IndexOutOfBoundsException
{
_XMLStudentList.addElement(vXMLStudent);
}
public void addXMLStudent (int index, xsd.XMLStudent vXMLStudent)
throws java.lang.IndexOutOfBoundsException
{
_XMLStudentList.insertElementAt(vXMLStudent, index);
}
public java.util.Enumeration enumerateXMLStudent()
{
return_XMLStudentList.elements();
}
//--获取节点方法
public xsd.XMLStudent getXMLStudent(int index)
throws java.lang.IndexOutOfBoundsException
{
//--测试绑定索引
if((index<0) ||(index>_XMLStudentList.size())) {
throw new IndexOutOfBoundsException();
}
return (xsd.XMLStudent) _XMLStudentList.elementAt(index);
}
下面是该类实现的一组节点存取数据、删除数据和验证点数据的方法,将整个XML文件转化成要解析的对象,从中读取各节点[5]的数据,对XML文件进行读写操作(省略方法内容):getXMLStudent (),getXML-StudentCount (),isValid(,marshal (java.io.Writer,setXMLStudent (int, xsd.XMLStudent),setXMLStudent (xsd.XMLStudent,unmar-shal (Reader reader),unmarshalReader),validate(),marshal(org.xml.sax.ContentHandler handler),marshal(org.xml.sax.ContentHandler),removeAllXML Student(),removeXMLStudent(int).
}
2)XMLStudent.Java
该文件主要创建针对每一个XMLStudent节点进行具体操作的类。需要引进的类如下:
java.io.*,import java.util*,org.exolab.castor.xml.*,import org.xml.sax.ContentHandler;
/*******创建XmlStudent类主要代码*************/
public class XMLStudent extends XmlStudentType implements java.io.Serializable
{
public XMLStudent() {
super();
//--验证合法性
public boolean isValid()
{
try{
validate();
}
catch (ValidationException vex) {
return false;
}
return true;
}
/*********将节点对象写入XML文件中********/
public void marshal(java.io.Writer[6]out)
Throws MarshalException,ValidationException
{
Marshaller.marshal(this, out);
} public void marshal(org.xml.sax.ContentHandler handler)
Throws IOException,MarshalException,Validation Exception
{
Marshaller.marshal(this, handler);
}
/*******从XML文件中读取节点对象************/
public static java.lang.Object unmarshal(java.io.Reader reader)
throwsMarshalException,ValidationException
{
return (xsd.XMLStudent) Unmarshaller.unmarshal(xsd.XML Student.class, reader);
}
//--void validate()
public void validate()
throws org.exolab.castor.xml.ValidationException
{
org.exolab.castor.xml.Validatorvalidator= new Validator();
validator.validate(this);
}}
3)XmlStudentType.java
该文件主要创建对每个XmlStudent节点的子节点的数据解析类,需要引进的类如下:
java.io.*,import java.util*,org.exolab.castor.xml.*,import org.xml.sax.ContentHandler;
/**********创建XmlStudentType类主要代码*******************/
public class XmlStudentType implements java.io.Serializable{
private int_ID;
private boolean_has_ID;
private java.lang.String_identify;
private java.lang.String_name;
private java.lang.String_sex;
private java.lang.String_birthday;
private java.lang.String_address;
private java.lang.String_telephone;
private java.lang.String_mem;
//--构造方法
public XmlStudentType() {
super();
}
public void deleteID()
{
this._has_ID=false;
}//--void deleteID()
/**************相应每一个属性的一对setXxx/getXxx方法,这里略写*******/
...............................................
//--验证合法性
public boolean isValid()
{
try{
validate();
}
catch (ValidationException vex) {
return false;
}
return true;
}
//写数据
public void marshal(java.io.Writer out)
Throws MarshalException,ValidationException
{
Marshaller.marshal(this, out);
}
public void marshal(ContentHandler handler)
throws IOException,MarshalException,Validation Exception
{
Marshaller.marshal(this, handler);
}
//--读数据
public static java.lang.Object unmarshal(java.io.Reader reader)
Throws MarshalException,ValidationException
{
return (xsd.XmlStudentType) Unmarshaller.unmarshal(xsd.XmlStudentType.class, reader);
}
public void validate()
throws ValidationException
{
org.exolab.castor.xml.Validator validator=new Validator();
validator.validate(this);
}//--void validate()
}
4 创建可视化界面测试程序
创建可视化界面类,如图2所示,将有关学生信息输入该界面,然后提交给上面有关的类,即可实现测试。
5 结束语
根据以上代码的实践,笔者将XML与Java程序代码完整地绑定在一起,为跨平台地数据交互提供了很大地方便,并为开发人员提供了XML文件解析的另一中有效途径。
[1]郝俊寿.XML程序设计案例教程[M].北京:机械工业出版社,2012.
[2]徐宏喆.实用软件设计模式教程[M].北京:清华大学出版社,2010.
[3]杨少波.J2EE Web核心技术-XHTML与XML应用开发[M].北京:清华大学出版社,2011.
[4]陈烨.JBuilder7编程实作指南[M].北京:北京希望电子出版社,2003.
[5]Brett D.Mclaugblin.Java与XML[M].江文,译.北京:中国电力出版社,2011.
[6]吴亚峰.Java se 6.0.[M].北京:人民邮电出版社,2007.