К сожалению, установка 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