Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时通过加载模式验证XML,失败取决于模式顺序_Java_Xml_Xml Validation - Fatal编程技术网

Java 在运行时通过加载模式验证XML,失败取决于模式顺序

Java 在运行时通过加载模式验证XML,失败取决于模式顺序,java,xml,xml-validation,Java,Xml,Xml Validation,我正在尝试进行xml验证。我在运行时得到一个模式列表(可能包装在一个jar中)。根据我向SchemaFactory提供模式的顺序,验证通过或失败 以下是我正在做的: private void validateXml(String xml, List<URI> schemas){ Source[] source = new StreamSource[schemas.size()]; int i=0; for (URI f : sche

我正在尝试进行xml验证。我在运行时得到一个模式列表(可能包装在一个jar中)。根据我向SchemaFactory提供模式的顺序,验证通过或失败

以下是我正在做的:

  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()));
private void validateXml(字符串xml,列表模式){
Source[]Source=newstreamsource[schemas.size()];
int i=0;
for(urif:schemas){
source[i++]=新的StreamSource(f.openStream());
}
SchemaFactory sf=SchemaFactory.newInstance(xmlstants.W3C_XML_SCHEMA_NA_URI);
setResourceResolver(新的MyClassPathResourceResolver());
Schema=schemaFactory.newSchema(源代码);
Validator Validator=schema.newValidator();
validator.validate(新的StreamSource(新的ByteArrayInputStream(xml.getBytes()));

同样,如果传递的模式集不是以xml根元素引用的模式开始的,则此操作将失败。是否对此进行了修复,或者我是否做错了什么?

默认情况下,Xerces将忽略一个模式文档,如果它已经具有相同命名空间的模式文档。可以使用factory选项更改此行为>

首先,您必须通过调用registerErrorHandler()方法在xml读取器上设置org.xml.sax.ErrorHandler对象的实例。您可能会收到警告,这将为您提供有关问题的线索


其次,您必须知道正在使用哪个xml库在您的代码中输入并打印。一旦您了解了库,您可以参考它的文档,如果它支持打开/关闭多个模式导入功能。

我在这个链接中获得了HTTP 404,您能提供一些其他详细信息吗?此外,我需要加载2个模式(每个模式导入其他模式)。如果我按正确的顺序加载这些,一切正常。否则,没有乐趣。这两个模式有不同的目标空间。尝试搜索它,而不是将其用作URL。它是JAXP选项名,而不是URL。(好的,一些浏览器通过将地址栏和搜索栏组合在一起使这一点变得困难。按照老方法,通过访问google.com进行搜索)。当我尝试在工厂上设置上述功能时,我得到:
SAXNotRecognizedException:feature“http://apache.org/xml/features/validation/schema/handle-multiple-imports"未被识别
也许您使用的是Xerces的JDK版本,而不是Apache版本?但很抱歉,我为您指出了正确的方向,但我不能再进一步了,这是为我的竞争对手的产品提供支持!您能将模式和XML发布到某个地方吗?@DavidMatheson不幸的是,这是不可能的,我可以说不能它是一组模式、根模式和第二个模式,允许用不同的标记替换第一个模式的主体。类是
com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory