parser.setFeature与parser.setValidating之间的区别

3

What is the diffrence between the following:

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,我正在调用digester上的setFeature或setValidating方法。


1
除非在特定解析器的API上下文中,否则您的问题没有有意义的答案。如果您不确定解析器,唯一合理的答案是类似于“这三个表达式拼写不同;下一个问题?”因此:哪个解析器,哪个API? - C. M. Sperberg-McQueen
@C. M. Sperberg-McQueen,我已经将问题中的细节纳入考虑。 - Nik
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,你会注意到他们在内部使用验证设置(isValidationsetValidating)来进行验证功能。

  • setFeature

    else if (name.equals(VALIDATION_FEATURE)) {
        setValidating(value);
        return;
    }
    
  • getFeature

    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"));
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接