3

以下有什么区别:

parser.setFeature("http://xml.org/sax/features/validation",true);
and
parser.setFeature("http://apache.org/xml/features/validation/schema",true);
and
parser.setValidating(true);

我在谷歌搜索中找到了两次确切的问题,但没有找到答案

我正在使用 org.apache.commons.digester,我在消化器上调用 setFeature 或 setValidating。

4

1 回答 1

2

我正在寻找同一个问题的答案。您可能已经找到了答案,但对于像我这样到达此线程的其他人。

据我所知,它是特定于实现的。SAX 似乎并没有真正的规范(规范是他们的网站 saxproject.org)。至少我在规范或 javadoc(也许我忽略了)中没有找到任何 isValidating 应该与验证功能同步的参考。

public boolean isValidating()
Indicates if this SAXParserFactory is configured to produce parsers that validate
XML documents as they are parsed.

但是,例如,如果您查看 Xerces 的实现:org.apache.xerces.jaxp.SAXParserFactoryImpl,您会注意到它们在内部使用验证设置 ( isValidation, setValidating) 来实现验证功能。

  • 设置功能

    else if (name.equals(VALIDATION_FEATURE)) {
        setValidating(value);
        return;
    }
    
  • 获取特征

    else if (name.equals(VALIDATION_FEATURE)) {
        return isValidating();
    }
    

或者,如果您查看 Sun 源

public void setValidating(boolean validating) {
    putInFeatures(VALIDATION_FEATURE, validating);
}

(示例来自 openjdk-6-src-b31-15_apr_2014)

另一个是来自Oracle XDK的 oracle xmlparserv2

一些示例测试来证明这一点(您需要 oracle xmlparserv2 jar,并且您还需要一个 META-INF/services/javax.xml.parsers.SAXParserFactory 文件,org.apache.xerces.jaxp.SAXParserFactoryImpl因为 oracle jar 是……相当占主导地位)

public class SaxParserTest {
    @Test
    public void validationFeatureTestXerces() throws Exception {
        SAXParserFactory parserFactory = org.apache.xerces.jaxp.SAXParserFactoryImpl.newInstance();

        parserFactory.setFeature("http://xml.org/sax/features/validation", false);
        Assert.assertFalse(parserFactory.isValidating());
        parserFactory.setFeature("http://xml.org/sax/features/validation", true);
        Assert.assertTrue(parserFactory.isValidating());

        parserFactory.setValidating(true);
        Assert.assertTrue(parserFactory.getFeature("http://xml.org/sax/features/validation"));
        parserFactory.setValidating(false);
        Assert.assertFalse(parserFactory.getFeature("http://xml.org/sax/features/validation"));
    }

    @Test
    public void validationFeatureTestOracle() throws Exception {
        SAXParserFactory parserFactory = oracle.xml.jaxp.JXSAXParserFactory.newInstance();

        parserFactory.setFeature("http://xml.org/sax/features/validation", false);
        Assert.assertFalse(parserFactory.isValidating());
        parserFactory.setFeature("http://xml.org/sax/features/validation", true);
        Assert.assertTrue(parserFactory.isValidating());

        parserFactory.setValidating(true);
        Assert.assertTrue(parserFactory.getFeature("http://xml.org/sax/features/validation"));
        parserFactory.setValidating(false);
        Assert.assertFalse(parserFactory.getFeature("http://xml.org/sax/features/validation"));
    }

}
于 2014-06-27T09:42:28.573 回答