禁用基于外部DTD / XSD的XML验证

时间:2011-05-04 12:41:26

标签: java xml validation xsd dtd

有没有办法在不修改源代码(构建DocumentBuilder的库)的情况下,基于外部DTD / XSD禁用XML验证?类似于设置DocumentBuilderFactory功能的JVM范围默认值,以及SAX的默认值?

在IDE中编辑文件时验证很棒,但我不需要因为somelib.net发生故障而无法启动我的webapp。

我知道我可以指定本地DTD / XSD位置,但这是一个不方便的解决方法。

有哪些选择?我能想到两个:

  • 实现我自己的DocumentBuilderFactory。
  • 拦截Xerces的DocumentBuilderImpl的构造并修改features Hashtable(添加http://apache.org/xml/features/nonvalidating/load-external-dtd)。

1 个答案:

答案 0 :(得分:6)

禁用验证可能无法阻止处理器获取DTD,因为它仍然可以这样做以便使用DTD中存在的属性默认值等(它将放置在树中),即使它没有实际< em>验证对抗DTD的语法。

在处理XML文档时阻止网络活动的一种方法是使用这样的“消隐解析器”:

import java.io.ByteArrayInputStream;
import java.io.IOException;

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class BlankingResolver implements EntityResolver
{

    public InputSource resolveEntity( String arg0, String arg1 ) throws SAXException,
            IOException
    {

        return new InputSource( new ByteArrayInputStream( "".getBytes() ) );
    }

}

然后在处理之前设置它:

DocumentBuilderFactory factory = DocumentBuilderFactory.
factory.setNamespaceAware( true );
builder = factory.newDocumentBuilder();
builder.setEntityResolver( new BlankingResolver() );
myDoc = builder.parse( myDocUri );
// etc.

您还将确保所处理的文档未被DTD.y

中的任何信息更改。