我需要在编码到 XML 文件之前验证我的 JAXB 对象。在 JAXB 2.0 之前,可以使用 javax.xml.bind.Validator。但这已被弃用,所以我试图找出正确的方法。我熟悉在编码(marshal)时间进行验证,但就我而言,我只想知道它是否有效。我想我可以编码到一个临时文件或内存并将其丢弃,但想知道是否有更优雅的解决方案。
最佳答案
首先,javax.xml.bind.Validator
已被弃用,取而代之的是 javax.xml.validation.Schema
(javadoc)。这个想法是您通过 javax.xml.validation.SchemaFactory
( javadoc ) 解析您的架构,并将其注入(inject)编码器/解码器。
至于您关于没有编码的验证的问题,这里的问题是 JAXB 实际上将验证委托(delegate)给 Xerces(或您正在使用的任何 SAX 处理器),并且 Xerces 将您的文档作为 SAX 事件流进行验证。因此,为了验证,您需要执行一些类型的编码。
影响最小的实现是使用 SAX 处理器的“/dev/null”实现。编码为空的 OutputStream 仍会涉及 XML 生成,这是一种浪费。所以我建议:
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(locationOfMySchema);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setSchema(schema);
marshaller.marshal(objectToMarshal, new DefaultHandler());
DefaultHandler
将丢弃所有事件,如果对模式的验证失败,marshal()
操作将抛出 JAXBException。
关于java - 如何在不编码的情况下验证 JAXB 2.0 中的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1560422/