我当前的验证不适用于XSD v1.1 Schemas。我尝试了很多方法来更改它,但直到现在仍未成功
解决方案是使用Saxon还是Xerces完成对我来说都没有关系(编辑:我不想花钱解决问题,而且看起来Saxon XSD1.1验证不是免费的,所以我提出我必须坚持Xerces)
是的,我已经在SO中进行了搜索,但是到目前为止,没有任何代码片段帮助我进行了有效的验证。
该代码将在eclipse插件中使用,如果那很重要的话
我在项目/类路径中添加了以下jar文件,但是看起来我的代码中没有使用它:



<dependency>
  <groupId>xerces</groupId>
  <artifactId>xercesImpl</artifactId>
  <version>2.11.0</version>
</dependency>



这里是我到目前为止用于验证的代码(如果不能将其用于xsd1.1,则转储没有问题):

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

import org.apache.xerces.parsers.DOMParser;
import org.apache.xerces.xni.parser.XMLInputSource;

....

public List<MyError> validate(File xmlFile) {
    List<MyError> errors = null;
    try {
        DOMParser parser = new DOMParser();
        parser.setFeature(XmlUtils.VALIDATION, true);
        parser.setFeature(XmlUtils.VALIDATION_SCHEMA, true);
        parser.setFeature(XmlUtils.ALL_SCHEMA_LOCATIONS, true);
        parser.setFeature(XmlUtils.DEFER_NODE_EXPANSION, false);

        Handler handler = new Handler(xmlFile, parser);
        parser.setErrorHandler(handler);

        // there probably are smarter ways to do this
        String uri = xmlFile.toURI().toString().replace("%20", " ");
        InputStream inputStream = new FileInputStream(xmlFile);
        XMLInputSource inputSource = new XMLInputSource("", uri, uri, inputStream, "UTF-8");
        parser.parse(inputSource);

        errors = handler.getErrors();

    }
    catch (Exception e)
    {
        ConsoleHandler.printError("Document " + xmlFile.getName() + " has not been parsed correctly: " + e.getMessage(), true);
        ConsoleHandler.printStackTrace(e);
    }
    // printing the errors happens in some other method
    return errors;
}

最佳答案

您已将此标签标记为“ Saxon”,所以我认为您正在寻找Saxon解决方案。 (但您也将其标记为“ Xerces”)。您已经显式实例化了Xerces DOMParser,因此这里没有任何东西可以调用Saxon作为模式验证器。如果您需要Xerces解决方案,那么我不是专家,也无法为您提供帮助。如果您需要Saxon解决方案,可以在saxon-resources下载文件(在SourceForge和saxonica.com上都可以找到)中找到很多示例。以下是一些摘录,它们大致可以满足您的需求:

s9api示例:

            Processor proc = new Processor(true);
            SchemaManager sm = proc.getSchemaManager();
            sm.load(new StreamSource(new File("data/books.xsd")));

            try {
                SchemaValidator sv = sm.newSchemaValidator();
                sv.validate(new StreamSource(new File("data/books.xml")));
                System.out.println("First schema validation succeeded (as planned)");
            } catch (SaxonApiException err) {
                System.out.println("First schema validation failed");
            }


JAXP示例:

            System.setProperty("javax.xml.transform.TransformerFactory",
                               "com.saxonica.config.EnterpriseTransformerFactory");
            TransformerFactory factory = TransformerFactory.newInstance();
            System.err.println("TransformerFactory class: " + factory.getClass().getName());
            factory.setAttribute(FeatureKeys.SCHEMA_VALIDATION, new Integer(Validation.STRICT));
            factory.setAttribute(FeatureKeys.VALIDATION_WARNINGS, Boolean.TRUE);
            if (args.length > 1) {
                StreamSource schema = new StreamSource(new File(args[1]).toURI().toString());
                ((EnterpriseTransformerFactory)factory).addSchema(schema);
            }
            Transformer trans = factory.newTransformer();
            StreamSource source = new StreamSource(new File(args[0]).toURI().toString());
            SAXResult sink = new SAXResult(new DefaultHandler());
            trans.transform(source, sink);

关于java - 针对Java 1.8中的XSD v1.1模式验证xml文件的示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35941613/

10-11 10:44