如何在XMLReaderFactory中设置FEATURE_SECURE_PROCESSING?

时间:2014-04-23 07:32:32

标签: java xmlreader saxparser

我正在使用Piccolo jar并使用XMLReaderFactory创建XML阅读器。 我需要设置安全处理功能,因此我这样做了,

xmlReader = XMLReaderFactory.createXMLReader("com.bluecast.xml.Piccolo"); xmlReader.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);

但这是错误 org.xml.sax.SAXNotRecognizedException: http://javax.xml.XMLConstants/feature/secure-processing at com.bluecast.xml.Piccolo.setFeature(Piccolo.java:937)

我有一个旧的xercesImpl.jar,它已被xercesImpl-2.9.1.jar取代但仍然得到相同的错误。我用谷歌搜索,没有找到任何具体的解决方案。

请帮助,任何想法都很明显。

2 个答案:

答案 0 :(得分:2)

因此常量XMLConstants.FEATURE_SECURE_PROCESSING的值为http://javax.xml.XMLConstants/feature/secure-processing

根据源代码here(最新版本为1.04),一个if if else块会检查该值是否为允许的功能之一,如果不是则抛出此异常。事实上,它不是被认为是合法的价值观之一,因此抛出异常。

根据SaxParserFactory,我们阅读了

  

所有实现都需要支持   javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING功能。

Piccolo实现了Parser,而不是SaxParser。总而言之,我会说Piccolo不支持该功能。也许我会说使用另一个支持它的XMLReader。

答案 1 :(得分:0)

有趣的是,用于SAX2的Oracle JDK内部Xerces版本的XMLReaderFactory也不提供此功能设置器。我不确定是什么,或者推荐的替代方案应该是什么。有这样的解决方法:

    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
    XMLReader reader = spf.newSAXParser().getXMLReader();

奇怪。在内部,它映射到具有不同实体扩展限制的 security-manager (com.sun.org.apache.xerces.internal.utils.XMLSecurityManager)。此外,它还将新属性XMLConstants.ACCESS_EXTERNAL_DTDXMLConstants.ACCESS_EXTERNAL_SCHEMA设置为""(无外部访问权限)。