首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

xml与java对象投射

2012-08-16 
xml与java对象映射JAXB提供了XML到java对象(类)之间的相互映射(转换),我们可以利用JAXB来消除繁琐的XML解

xml与java对象映射

JAXB提供了XML到java对象(类)之间的相互映射(转换),我们可以利用JAXB来消除繁琐的XML解析工作。

下面是引用oracle网站中有关jaxb的一句话。

?

Now developers have another Java API at their disposal that can make it easier to access XML documents:?Java Architecture for XML Binding (JAXB). A Reference Implementation of the API is now available in the?Java Web Services Developer Pack V 1.1.

xml与java对象投射

?

JAXB包括两部分:

1.编译器程序:负责根据XML Schema(xsd文件)编译生成对应java类文件

2.JAXB API:程序中调用这些api,再结合1中的类达到映射的目的

?

对于JAXB的安装及编译器部分的使用请参见:http://maimode.iteye.com/admin/blogs/1329929

xml与java对象投射

?

本篇将主要针对api部分给出代码示例,并在后文中给出文档校验的方法。

?

无论是将xml映射为java对象还是将java对象映射为xml,都首先要使用JAXB的编译器将XSD文件编译成java类文件,然后在项目中导入这些类。

?

需要引用一下类:

?

import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;
?

?

?

A. 将XML映射为java对象

xml与java对象投射

// 建立上下文 amos.note为编译器生成的类文件的包名称JAXBContext jaxbContext = JAXBContext.newInstance("amos.note");// 建立unmashaller对象Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();// 将xml文件映射为java对象Note note = (Note) unmarshaller.unmarshal(new File("e:/t/t.xml"));// TODO ....

?以上代码片段就是将t.xml文件中的根Note节点映射为了Note对象,也可以将其他形式的xml进行映射。

?

?

B. 将java对象映射为XML

xml与java对象投射

// 准备要映射的对象 amos.note.ObjectFactory是编译器生成的类amos.note.ObjectFactory objFactory = new amos.note.ObjectFactory();Note note = objFactory.createNote();//上面的note对象也可是A部分中的那个note对象,这样A、B两个步骤和在一起就是对xml文件的更新了// 建立上下文 amos.note为编译器生成的类文件的包名称JAXBContext jaxbContext = JAXBContext.newInstance("amos.note");// 建立mashaller对象Marshaller marshaller = jaxbContext.createMarshaller();// 将java对象映射为xml文件marshaller.marshal(note, new FileOutputStream("e:/t/t.xml"));

?以上代码片段就是将Note对象映射为t.xml文件中的根Note节点,也可以映射成为其他形式的对象。

?

?

基于XSD的XML文档校验

?

参考:http://www.ibm.com/developerworks/cn/xml/x-javaxmlvalidapi.html

?

import javax.xml.transform.Source;import javax.xml.transform.stream.StreamSource;import javax.xml.validation.Schema;import javax.xml.validation.SchemaFactory;import javax.xml.validation.Validator;?

?

/** * 根据xsd文件校验一个xml文件是否有效,当无效异常时交由errorHandler处理异常 * * @param xmlFilePath * @param xsdFilePath * @param errorHandler * @return * @throws IOException * @throws SAXException */private boolean doValidate(String xmlFilePath, String xsdFilePath,ErrorHandler errorHandler) throws IOException, SAXException {boolean rt = false;// 1. Lookup a factory for the W3C XML Schema languageSchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);// 2. Compile the schema.// Here the schema is loaded from a java.io.File, but you could use// a java.net.URL or a javax.xml.transform.Source instead.File schemaLocation = new File(xsdFilePath);Schema schema = factory.newSchema(schemaLocation);// 3. Get a validator from the schema.Validator validator = schema.newValidator();validator.setErrorHandler(errorHandler);// 4. Parse the document you want to check.Source source = new StreamSource(xmlFilePath);// 5. Check the documenttry {validator.validate(source);rt = true;} catch (SAXException ex) {rt = false;}return rt;}

需要注意的是,当传入有效的ErrorHandler示例后,执行validator.validate(source)方法时无论是否出现异常都不在抛出SAXException异常。

?

因此,下面的方法包装上面的方法来验证

/** * 根据xsd文件校验一个xml文件是否有效 * @param xmlFilePath * @param xsdFilePath * @return true-有效 false-无效 * @throws IOException * @throws SAXException */public boolean validate(String xmlFilePath, String xsdFilePath) throws IOException, SAXException{return this.doValidate(xmlFilePath, xsdFilePath, null);}/** * 根据xsd文件校验一个xml文件是否有效,当无效异常时交由errorHandler处理异常 * @param xmlFilePath * @param xsdFilePath * @param errorHandler * @throws IOException * @throws SAXException */public void validate(String xmlFilePath, String xsdFilePath, ErrorHandler errorHandler) throws IOException, SAXException{boolean rt = this.doValidate(xmlFilePath, xsdFilePath, errorHandler);}

?

?

其实,验证的这个步骤不必单独占用一些列资源而只做这一件事,可以在上面的映射过程中完成,oracle网站上提供了验证的说明,但是我自己测试发现他说的方法已经废弃了,因此,没有在映射的代码中提到,还有待研究。

?

附件xml.zip是完整的示例程序

热点排行