一个完整个对象-模型映射,一定少不了对验证的支持。
jaxb当然也支持验证,分为两个部分:marshall和unmarshall。
一、unmarshall端
unmarshall是从xml到java对象的过程,因此验证的是这个xml文件是不是有效的,要在unmarshall端使用验证非常简单:
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- unmarshaller.setSchema(SchemaFactory.newInstance(
- XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(
-
new File("students.xsd")));
从jaxb2.0开始,通过调用方法setSchema()的方式来指定验证,在2.0以前的版本里,通过调用setValidating()方法来指定验证:
-
unmarshaller.setValidating(true)
验证信息可以是一个schema文件,也可以是一个dtd文件(如果支持的话),要使用dtd的验证,则代码大致为:
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- unmarshaller.setSchema(SchemaFactory.newInstance(
- XMLConstants.RELAXNG_NS_URI).newSchema(
-
new File("students.dtd")));
一旦设置了验证信息,在进行unmarshell的时候,jaxb就会对读入的xml文件进行验证,例如有schema文件:
- <?xml version="1.0" encoding="UTF-8"?>
-
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.liulutu.com/students/"
-
targetNamespace="http://www.liulutu.com/students/">
-
<element name="students">
-
<complexType>
-
<sequence>
-
<element name="student" type="tns:StudentType" maxOccurs="unbounded" />
-
</sequence>
-
</complexType>
-
</element>
-
<simpleType name="SexType">
-
<restriction base="string">
-
<enumeration value="Male"></enumeration>
-
<enumeration value="Female"></enumeration>
-
</restriction>
-
</simpleType>
-
-
<complexType name="StudentType">
-
<attribute name="sex" type="tns:SexType"></attribute>
-
<attribute name="name" type="string"></attribute>
-
</complexType>
-
</schema>
和符合这个schema的一个xml文件:
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
<ns2:students xmlns:ns2="http://www.liulutu.com/students/">
-
</ns2:students>
如果指定了需要验证,当根据上面的schema读入些xml时,就会抛出一个验证失败异常:
- [org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content of element 'ns2:students' is not complete. One of '{student}' is expected.]
- at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(Unknown Source)
- at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(Unknown Source)
- at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)
- at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)
- at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
- at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
- at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
- at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
注:需要在unmarshall.unmarshall()方法调用之前设置验证信息。
二、marshall端
jaxb2.0中,marshall和unmarshall的验证设置是一样的:
- ObjectFactory factory = new ObjectFactory();
- Students students = factory.createStudents();
- Marshaller marshaller = jaxbContext.createMarshaller();
-
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
- marshaller.setSchema(SchemaFactory.newInstance(
- XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(
-
new File("students.xsd")));
-
marshaller.marshal(students, new File("a.xml"));
和上面一样,会得到一个异常信息:
- [org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content of element 'ns2:students' is not complete. One of '{student}' is expected.]
- at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(Unknown Source)
- at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(Unknown Source)
-
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(Unknown Source)
如果使用jaxb2.0之前的版本,则验证方式如下:
- Validator validator = jaxbContext.createValidator();
- validator.validate(students);
分享到:
相关推荐
通过分析这个"JAXB.zip_jaxb"压缩包的内容,我们可以学习到如何在NetBeans中创建和管理一个JAXB项目,理解JAXB的基本原理和用法,以及如何利用Ant进行构建和测试。这不仅有助于加深对JAXB的理解,也能够提升在实际...
通过这个项目,你可以学习如何在实际应用中使用JAXB进行XML数据的处理,并确保数据的有效性和一致性。 总结,JAXB是Java平台上强大的XML处理工具,它通过将XML与Java Bean之间建立映射,简化了数据交换。结合XSD...
### Jaxb入门学习知识点详解 #### 一、JAXB概念与作用 JAXB (Java Architecture for XML Binding) 是一种将XML数据与Java对象互相转换的技术。它通过编组(marshalling)和解组(unmarshalling)的过程,使得开发者...
Java JDK 1.6是Java开发工具包的一个重要版本,发布于2006年,引入了许多增强功能和新特性,极大地提升了开发效率...通过这样的示例,学习者可以深入理解JAXB的工作原理,以及它如何简化Java程序与XML数据交互的过程。
5. **测试服务**: 使用Axis自带的`testClient`或自定义客户端调用服务,验证部署是否成功。 接下来,我们来看JAXB的角色。JAXB允许你通过注解将Java类映射为XML Schema,反之亦然。在Web服务中,JAXB通常用于处理...
4. **XML Schema支持**:JAXB支持XML Schema,这意味着开发者可以基于XML Schema来验证XML文档,确保数据的正确性。 5. **集成性**:JAXB可以与其他Java技术如JAX-WS(Java API for XML Web Services)无缝集成,...
`jaxb-istack-commons` 就是在JAXB基础上进行扩展和增强的工具集,它提供了许多实用工具类和方法,帮助开发者更轻松地处理与XML相关的操作,比如XML的序列化和反序列化,以及XML数据的验证等。 关于许可,`jaxb-...
标题中的“纯Java(swing)写的xsd验证xml”是指使用Java编程语言,结合Swing图形用户界面库,开发的一个工具,用于...此外,你还可以学习如何将XML解析库(如JAXB或DOM)与自定义逻辑结合,以实现XML文档的验证功能。
教程通常包括逐步指南,演示如何创建基本的JAXB绑定,如何生成Java类,如何使用Unmarshaller和Marshaller,以及如何处理XML验证和错误。这些教程对于初学者尤其有用,帮助他们快速上手并掌握JAXB的基本操作。 "jaxb...
5. **数据绑定API的使用**:JAXB提供了诸如`Marshaller`、`Unmarshaller`、`Binder`和`ValidationEventHandler`等接口,示例中会展示如何利用这些API进行XML数据的序列化和反序列化,并处理可能出现的错误和验证问题...
如果你正在学习或使用JAXB处理XML,这篇博客可能会提供一些实用的指导。 总的来说,这个压缩包提供了一个使用Java JAXB处理XSD-10的示例项目,涵盖了从XSD到Java对象的映射,以及可能的反向转换,是理解JAXB工作...
8. **自定义逻辑**:虽然JAXB提供了自动化转换,但有时仍需编写自定义逻辑来处理特殊需求,例如数据验证、转换或计算。 了解以上知识点后,开发者可以有效地利用Suunto SML模型与JAXB技术,构建与Suunto设备兼容的...
通过学习本书,读者可以掌握Java与XML的集成技巧,理解如何利用Java API处理XML文档,以及如何构建和消费Web服务。对于Java开发者来说,XML技术是必备的技能之一,这本手册将帮助他们提升在这个领域的能力。
- 类到XML:学习如何使用JAXB注解将Java类映射为XML文档。 - XML到类:掌握如何从XML文档反向生成Java对象。 通过这九个章节的学习,可以全面了解XML的核心概念和技术,并掌握如何在实际项目中运用这些知识,实现...
三、XML Schema验证 XML Schema定义了XML文档的结构和数据类型,确保文档符合预定规范。使用XML Schema验证,可以避免因数据格式错误导致的问题。在Java中,可以使用`javax.xml.validation`包提供的API进行验证,...
通过阅读和理解这些文件,你可以学习如何在实际项目中结合 Camel 和 JAXB 来处理 XML 数据。 总结来说,"CamelJAXBExample" 是一个展示如何在 Apache Camel 中利用 JAXB 处理 XML 数据的示例。这个例子将帮助开发者...
这些基础知识是理解XML数据结构和验证机制的关键,对于任何想要处理XML的Java开发者来说,都是不可或缺的。 接着,书中的章节会深入讲解Java API for XML Processing (JAXP),这是Java平台用于解析和生成XML的官方...
7. **Servlets、JSP与Web框架**:掌握Servlet和JSP的生命周期,学习JSTL和其他第三方标签库。熟悉主流的Web框架,如JSF、Struts、Tapestry、Cocoon和WebWork,理解MVC模式。 8. **Web服务器与部署**:学习如何配置...
- **开发框架**: 如Java中的JAXB(Java Architecture for XML Binding)等工具可以帮助开发者更方便地处理XML数据。 #### 四、XML的实例分析 **4.1 示例文档分析** - **结构**: 分析XML示例文档的结构,理解各...
深入学习Java安全模型,包括类加载器安全、字节码验证、安全管理器、策略和权限、代码签名、数字签名、加密学基础、认证机制(如Kerberos)。熟悉各种安全/认证API,如JAAS(Java Authentication and Authorization ...