验证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的根元素。有没有解决这个问题,还是我做错了什么?
默认情况下,如果模式文档已经具有相同命名空间的模式文档,则Xerces将忽略模式文档。这种行为可以使用厂家的选项
http://apache.org/xml/features/validation/schema/handle-multiple-imports
我在这个链接中获得一个HTTP 404,你能提供一些额外的细节吗? – 2012-08-08 12:12:37
另外,我需要加载2个模式(每个模式导入加入模式)。如果我按照正确的顺序加载它们,一切都很好。否则,没有快乐。这两个模式具有不同的目标空格。 – 2012-08-08 12:13:36
尝试搜索它,而不是将其用作URL。这是一个JAXP选项名称而不是URL。 (好吧,有些浏览器通过结合地址栏和搜索栏来实现这一点很困难,通过转到google.com以旧的方式进行)。 – 2012-08-10 19:46:29
首先被改变,你必须通过调用registerErrorHandler()方法设置org.xml.sax.ErrorHandler对象对XML阅读器的实例。您可能会收到一些警告,让您知道问题。
其次,你必须知道你正在使用哪个xml库。在你的代码中调用schemaFactory.getClass()。getName()并打印它。知道库之后,如果它支持功能来打开/关闭多个模式导入,则可以参考它的文档。
类是'com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory' – 2012-08-28 16:10:43
你可以在哪里发布模式和XML吗? – davidfmatheson 2012-08-22 12:46:16
@davidfmatheson不幸的是,这是不可能的,我可以说它是一组模式,根模式和第二模式,它们允许用不同的标记替换第一模式的主体。 – 2012-08-22 12:54:01