java - how can I tell xalan NOT to validate XML retrieved using the "document" function? -
yesterday oracle decided take down java.sun.com while. screwed things me because xalan tried validate xml couldn't retrieve properties.dtd.
i'm using xalan 2.7.1 run xsl transforms, , don't want validate anything. tried loading xsl this:
saxparserfactory spf = saxparserfactory.newinstance(); spf.setnamespaceaware(true); spf.setvalidating(false); xmlreader rdr = spf.newsaxparser().getxmlreader(); source xsl = new saxsource(rdr, new inputsource(xslfilepath)); templates cachedxslt = factory.newtemplates(xsl); transformer transformer = cachedxslt.newtransformer(); transformer.transform(xmlsource, result);
in xsl itself, this:
<xsl:variable name="entry" select="document(concat($prefix, $locale_part, $suffix))/properties/entry[@key=$key]"/>
the xml code retrieves has following definition @ top:
<!doctype properties system "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="...
despite java code above instructing parser not validate, still sends request java.sun.com. while java.sun.com unavailable, makes transform fail message:
can not load requested doc: http://java.sun.com/dtd/properties.dtd
how xalan stop trying validate xml loaded "document" function?
the documentation mentions parser may read dtds if not validating, may become necessary use dtd resolve (expand) entities.
since don't have control on xml documents, nont's option of modifying xml not available me.
i managed shut down attempts pull in dtd documents sabotaging resolver, follows.
my code uses documentbuilder return document (= dom) xmlreader per op's example has method setentityresolver
same technique should work that.
documentbuilderfactory factory = documentbuilderfactory.newinstance(); factory.setvalidating(false); // turns off validation factory.setschema(null); // turns off use of schema // that's *still* not enough! builder = factory.newdocumentbuilder(); builder.setentityresolver(new nullentityresolver()); // swap in dummy resolver return builder().parse(xmlfile);
here, now, fake resolver: returns empty inputstream no matter what's asked of it.
/** resolver doesn't */ private static class nullentityresolver implements entityresolver { public inputsource resolveentity(string publicid, string systemid) throws saxexception, ioexception { // message debugging / if care system.out.println("i'm asked resolve: " + publicid + " / " + systemid); return new inputsource(new bytearrayinputstream(new byte[0])); } }
alternatively, fake resolver return streams of actual documents read local resources or whatever.
Comments
Post a Comment