我如何在jaxb中解组并享受模式验证而不使用显式模式文件

转:

我在应用程序配置中使用jaxb

我感觉自己在做某些真正歪曲的事情,我正在寻找一种不需要实际文件或事务的方法。

如您在代码中看到的,我:

1.从我的JaxbContext中创建一个模式到文件中(实际上是从我的类注释中)2.设置该模式文件以便在我解组时允许真正的验证

JAXBContext context = JAXBContext.newInstance(clazz);
Schema mySchema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(schemaFile);
jaxbContext.generateSchema(new MySchemaOutputResolver()); // ultimately creates schemaFile   
Unmarshaller u = m_context.createUnmarshaller();
u.setSchema(mySchema);
u.unmarshal(...);

你们中的任何人都知道我如何可以验证jaxb而不需要创建计算机中的架构文件吗?

我是否需要创建一个验证模式,当通过JaxbContect.generateSchema获得它时,它看起来是多余的?

你怎么做到这一点?

seanf:

对于上面的ekeren解决方案,在单个线程中使用PipedOutputStream / PipedInputStream不是一个好主意,以免您溢出缓冲区并导致死锁。ByteArrayOutputStream / ByteArrayInputStream可以工作,但是如果您的JAXB类生成多个模式(在不同的命名空间中),则需要多个StreamSource。

我结束了这个:

JAXBContext jc = JAXBContext.newInstance(Something.class);
final List<ByteArrayOutputStream> outs = new ArrayList<ByteArrayOutputStream>();
jc.generateSchema(new SchemaOutputResolver(){
    @Override
    public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        outs.add(out);
        StreamResult streamResult = new StreamResult(out);
        streamResult.setSystemId("");
        return streamResult;
    }});
StreamSource[] sources = new StreamSource[outs.size()];
for (int i=0; i<outs.size(); i++) {
    ByteArrayOutputStream out = outs.get(i);
    // to examine schema: System.out.append(new String(out.toByteArray()));
    sources[i] = new StreamSource(new ByteArrayInputStream(out.toByteArray()),"");
}
SchemaFactory sf = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
m.setSchema(sf.newSchema(sources));
m.marshal(docs, new DefaultHandler());  // performs the schema validation

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何修复Angular不使用显式注释并且不能在严格模式下调用

如何使用JAXB针对模式验证XML?

如何在Mongo中使用Json模式验证Json文件?

如何在 C++ 中不使用显式类型调用模板函数?

如何显式设置登录模式的高度?

组装-如何在UEFI中设置图形模式(不使用VGA,不使用BIOS,不使用任何东西)

如何在JAXB中解组<!DOCTYPE>部分?

JAXB如何针对更多模式验证xml

如何在UNIX中使用文件中的模式查找行

如何在SQL模式下(而非数据集API)以显式存储级别使用CACHE或PERSIST?

如何在不使用 len() 的情况下使用累积模式计算代码中的字符数?

如何在文件中的模式中使用grep并获取每个模式的出现次数?

如何在文件中搜索多行模式?

如何在文件中搜索多行模式?

如何在Ruby中获取文件模式?

如何在不使用find的情况下在当前目录的直接子目录中获取名称中包含某些模式的所有文件?

如何在Python中避免显式的“自我”?

如何在Coq搜索模式中指定显式相等性?

如何在python中使用正則表達式找到文件所需的模式?

JAXB解组不使用数据填充字段

使用JAXB解组xml文件

我们如何使用 C# 在 SharePoint 中获取当前的身份验证模式

如何使用文件中的排除模式

如何使用显式模式匹配修复 MonadFail (Either String) 错误

如何在Python中验证JSON模式架构?

如何在Angular 2中添加表单验证模式?

如何在pouchDB中删除身份验证模式

如何在类验证器模式中传递map参数

如何在SoapUI中针对模式验证JSON响应