0

我有一个 xsd 文件。我正在尝试javax.xml.validation.Schema使用该 xsd 文件进行创建。我写了一个程序来做到这一点。当我使用<?xml version="1.0" encoding="UTF-8"?>每件事时,一切正常。但是当我使用时<?xml version="1.1" encoding="UTF-8"?>,第一次尝试创建的Schema是抛出 NPE,但第二次和后续尝试都成功了。以下是来源:

import java.io.File;

import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

public class Test {
    SchemaFactory sf = null;

    public static void main(String args[]) {

        Test test = new Test();
        test.init();
        File schemaFile = new File("D:\\test.xsd");

        try {
            test.doIt(schemaFile);
        } catch (Exception e) {
            System.out.println("doIt() failed " + e.getMessage());
        }
        try {
            test.doItAgain(schemaFile);
        } catch (Exception e) {
            System.out.println("doItAgain() failed " + e.getMessage());
        }

        System.out.println("Execution completed");

    }

    public void doIt(File schemaFile) throws Exception {
        @SuppressWarnings("unused")
        Schema schema = null;
        synchronized (sf) {
            schema = sf.newSchema(schemaFile);
        }
        System.out.println("doIt() success");
    }

    public void doItAgain(File schemaFile) throws Exception {
        @SuppressWarnings("unused")
        Schema schema = null;

        synchronized (sf) {
            schema = sf.newSchema(schemaFile);
        }
        System.out.println("doAgainIt() success");
    }

    public void init() {
        sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
    }
}

首先执行的方法(doIt()doItAgain())是抛出 NPE。

下面是堆栈跟踪:

java.lang.NullPointerException
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1738)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1770)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipSpaces(XMLEntityScanner.java:1543)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$TrailingMiscDriver.next(XMLDocumentScannerImpl.java:1400)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
    at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaParsingConfig.parse(SchemaParsingConfig.java:435)
    at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaParsingConfig.parse(SchemaParsingConfig.java:491)
    at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaDOMParser.parse(SchemaDOMParser.java:510)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:1802)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:531)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:519)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:485)
    at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:210)
    at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:594)
    at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:610)
    at Test.doIt(Test.java:39)
    at Test.main(Test.java:20)

我的问题是,为什么 XML 1.1 不能正常工作?为什么只有第一次尝试不成功?

4

1 回答 1

1

我发现如果我使用最新版本的 Xerces jar,我不会遇到问题。我还发现这个问题是因为 JDK 本身存在一个错误,并且它也记录在openjdk 网站上,更有趣的是没有人愿意修复这个问题。因此,请使用最新版本的 Xerces jar 或使用 xml 版本 1.0。我会选择第一个选项。谁知道旧版本中会有多少隐藏的惊喜:P

于 2014-06-26T07:33:57.953 回答