验证XML在运行时加载架构,失败取决于架构顺序

问题描述:

我正在尝试执行xml验证。我在运行时给出了一个模式列表(可能用jar包装)。根据我向SchemaFactory提供架构的顺序,验证通过或失败。验证XML在运行时加载架构,失败取决于架构顺序

下面是我在做什么:

private void validateXml(String xml, List<URI> schemas){ 
     Source[] source = new StreamSource[schemas.size()]; 
     int i=0; 
     for (URI f : schemas){ 
      source[i++] = new StreamSource(f.openStream()); 
     } 

     SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NA_URI); 
     sf.setResourceResolver(new MyClassPathResourceResolver()); 

     Schema schema = schemaFactory.newSchema(source); 
     Validator validator = schema.newValidator(); 
     validator.validate(new StreamSource(new ByteArrayInputStream(xml.getBytes())); 

又来了,这如果传递的集架构不架构开始未能将XML referrs的根元素。有没有解决这个问题,还是我做错了什么?

+0

你可以在哪里发布模式和XML吗? – davidfmatheson 2012-08-22 12:46:16

+0

@davidfmatheson不幸的是,这是不可能的,我可以说它是一组模式,根模式和第二模式,它们允许用不同的标记替换第一模式的主体。 – 2012-08-22 12:54:01

默认情况下,如果模式文档已经具有相同命名空间的模式文档,则Xerces将忽略模式文档。这种行为可以使用厂家的选项

http://apache.org/xml/features/validation/schema/handle-multiple-imports

+0

我在这个链接中获得一个HTTP 404,你能提供一些额外的细节吗? – 2012-08-08 12:12:37

+0

另外,我需要加载2个模式(每个模式导入加入模式)。如果我按照正确的顺序加载它们,一切都很好。否则,没有快乐。这两个模式具有不同的目标空格。 – 2012-08-08 12:13:36

+0

尝试搜索它,而不是将其用作URL。这是一个JAXP选项名称而不是URL。 (好吧,有些浏览器通过结合地址栏和搜索栏来实现这一点很困难,通过转到google.com以旧的方式进行)。 – 2012-08-10 19:46:29

首先被改变,你必须通过调用registerErrorHandler()方法设置org.xml.sax.ErrorHandler对象对XML阅读器的实例。您可能会收到一些警告,让您知道问题。

其次,你必须知道你正在使用哪个xml库。在你的代码中调用schemaFactory.getClass()。getName()并打印它。知道库之后,如果它支持功能来打开/关闭多个模式导入,则可以参考它的文档。

+0

类是'com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory' – 2012-08-28 16:10:43