不幸的是,设置 xml.catalog.files 对解析器工厂没有任何影响。理想情况下当然应该这样做,但使用解析器的唯一方法是以某种方式添加一个方法,该方法将解析委托给 SAX 解析器使用的处理程序中的目录解析器。
如果您已经在使用 SAX 解析器,那非常简单:
final CatalogResolver catalogResolver = new CatalogResolver();
DefaultHandler handler = new DefaultHandler() {
public InputSource resolveEntity (String publicId, String systemId) {
return catalogResolver.resolveEntity(publicId, systemId);
}
public void startElement(String namespaceURI, String lname, String qname,
Attributes attrs) {
// the stuff you'd normally do
}
...
};
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser saxParser = factory.newSAXParser();
String url = args.length == 0 ? "http://horstmann.com/index.html" : args[0];
saxParser.parse(new URL(url).openStream(), handler);
否则,您需要确定是否可以提供自己的实体解析器。使用 javax.xml.parsers.DocumentBuilder,您可以。使用 scala.xml.XML 对象,你不能,但你可以使用诡计:
val res = new com.sun.org.apache.xml.internal.resolver.tools.CatalogResolver
val loader = new factory.XMLLoader[Elem] {
override def adapter = new parsing.NoBindingFactoryAdapter() {
override def resolveEntity(publicId: String, systemId: String) = {
res.resolveEntity(publicId, systemId)
}
}
}
val doc = loader.load(new URL("http://horstmann.com/index.html"))enter code here