我正在使用Java 5 javax.xml.validation.Validator来验证XML文件.我已经为一个仅使用导入的模式完成了它,一切正常.现在我正在尝试使用另一个使用import和一个include的模式进行验证.我遇到的问题是主模式中的元素被忽略,验证表明它无法找到它们的声明.
以下是我构建Schema的方法:
InputStream includeInputStream = getClass().getClassLoader().getResource("include.xsd").openStream();
InputStream importInputStream = getClass().getClassLoader().getResource("import.xsd").openStream();
InputStream mainInputStream = getClass().getClassLoader().getResource("main.xsd").openStream();
Source[] sourceSchema = new SAXSource[]{includeInputStream , importInputStream,
mainInputStream };
Schema schema = factory.newSchema(sourceSchema);
Run Code Online (Sandbox Code Playgroud)
现在这里是main.xsd中声明的摘录
<xsd:schema xmlns="http://schema.omg.org/spec/BPMN/2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:import="http://www.foo.com/import" targetNamespace="http://main/namespace" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:import namespace="http://www.foo.com/import" schemaLocation="import.xsd"/>
<xsd:include schemaLocation="include.xsd"/>
<xsd:element name="element" type="tElement"/>
<...>
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)
如果我在main.xsd中复制我包含的XSD的代码,它可以正常工作.如果我不这样做,验证不会找到"元素"的声明.
我正在使用jaxb进行应用程序配置
我觉得我正在做一些非常歪曲的事情,我正在寻找一种不需要实际文件或此交易的方法.
正如您在代码I中看到的:
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(...);
Run Code Online (Sandbox Code Playgroud)
你们中的任何人都知道如何在不需要创建位于我的计算机中的模式文件的情况下验证jaxb吗?
我是否需要创建用于验证的模式,当我通过JaxbContect.generateSchema获取它时,它看起来是多余的?
你怎么做到这一点?
使用最新的JAXB(Sun)并具有模式层次结构,这些模式在模式之间使用导入指令来共享类型定义.在JAXB中对Marshaller/Unmarshaller的setSchema调用中激活了模式验证,这应该将验证推迟到Xerces(使用Java 1.5).在使用SchemaFactory创建Schema对象时,我不想知道模式之间的import指令的顺序.不幸的是,我还没有找到允许这个的Xerces功能/属性.例如,如果使用导入将a.xsd拉入b.xsd,则以下代码不起作用:
FileInputStream a = new FileInputStream("a.xsd");
FileInputStream b = new FileInputStream("b.xsd");
Schema schema = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(
new Source[] {
new StreamSource(b),
new StreamSource(a)
}
);
Run Code Online (Sandbox Code Playgroud)
Source数组的顺序必须是a.xsd然后是b.xsd.有什么方法吗?