有没有办法在不修改源代码(构建DocumentBuilder的库)的情况下,基于外部DTD / XSD禁用XML验证?类似于设置DocumentBuilderFactory功能的JVM范围默认值,以及SAX的默认值?
在IDE中编辑文件时验证很棒,但我不需要因为somelib.net发生故障而无法启动我的webapp。
我知道我可以指定本地DTD / XSD位置,但这是一个不方便的解决方法。
有哪些选择?我能想到两个:
features
Hashtable(添加http://apache.org/xml/features/nonvalidating/load-external-dtd
)。答案 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
中的任何信息更改。