XMLGrammarBuilderpublic class XMLGrammarBuilder extends Object This sample program illustrates how to use Xerces2's grammar
preparsing and caching functionality. It permits either DTD or
Schema grammars to be parsed, and then allows instance documents to
be validated with them.
Note that, for access to a grammar's contents (via Xerces's
Schema Component model interfaces), slightly different methods need
to be used. Nonetheless, this should go some way to indicating how
grammar preparsing and caching can be coupled in Xerces to achieve
better performance. It's also hoped this sample shows the way
towards combining this functionality in a DOM or SAX context. |
Fields Summary |
---|
public static final String | SYMBOL_TABLEProperty identifier: symbol table. | public static final String | GRAMMAR_POOLProperty identifier: grammar pool. | protected static final String | NAMESPACES_FEATURE_IDNamespaces feature id (http://xml.org/sax/features/namespaces). | protected static final String | VALIDATION_FEATURE_IDValidation feature id (http://xml.org/sax/features/validation). | protected static final String | SCHEMA_VALIDATION_FEATURE_IDSchema validation feature id (http://apache.org/xml/features/validation/schema). | protected static final String | SCHEMA_FULL_CHECKING_FEATURE_IDSchema full checking feature id (http://apache.org/xml/features/validation/schema-full-checking). | protected static final String | HONOUR_ALL_SCHEMA_LOCATIONS_IDHonour all schema locations feature id (http://apache.org/xml/features/honour-all-schemaLocations). | public static final int | BIG_PRIME | protected static final boolean | DEFAULT_SCHEMA_FULL_CHECKINGDefault Schema full checking support (false). | protected static final boolean | DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONSDefault honour all schema locations (false). |
Methods Summary |
---|
public static void | main(java.lang.String[] argv)Main program entry point.
//
// MAIN
//
// too few parameters
if (argv.length < 2) {
printUsage();
System.exit(1);
}
XMLParserConfiguration parserConfiguration = null;
String arg = null;
int i = 0;
arg = argv[i];
if (arg.equals("-p")) {
// get parser name
i++;
String parserName = argv[i];
// create parser
try {
ClassLoader cl = ObjectFactory.findClassLoader();
parserConfiguration = (XMLParserConfiguration)ObjectFactory.newInstance(parserName, cl, true);
}
catch (Exception e) {
parserConfiguration = null;
System.err.println("error: Unable to instantiate parser configuration ("+parserName+")");
}
i++;
}
arg = argv[i];
// process -d
Vector externalDTDs = null;
if (arg.equals("-d")) {
externalDTDs= new Vector();
i++;
while (i < argv.length && !(arg = argv[i]).startsWith("-")) {
externalDTDs.addElement(arg);
i++;
}
// has to be at least one dTD or schema , and there has to be other parameters
if (externalDTDs.size() == 0) {
printUsage();
System.exit(1);
}
}
// process -f/F and -hs/HS
Vector schemas = null;
boolean schemaFullChecking = DEFAULT_SCHEMA_FULL_CHECKING;
boolean honourAllSchemaLocations = DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONS;
if(i < argv.length) {
arg = argv[i];
if (arg.equals("-f")) {
schemaFullChecking = true;
i++;
arg = argv[i];
}
else if (arg.equals("-F")) {
schemaFullChecking = false;
i++;
arg = argv[i];
}
if (arg.equals("-hs")) {
honourAllSchemaLocations = true;
i++;
arg = argv[i];
}
else if (arg.equals("-HS")) {
honourAllSchemaLocations = false;
i++;
arg = argv[i];
}
if (arg.equals("-a")) {
if(externalDTDs != null) {
printUsage();
System.exit(1);
}
// process -a: schema files
schemas= new Vector();
i++;
while (i < argv.length && !(arg = argv[i]).startsWith("-")) {
schemas.addElement(arg);
i++;
}
// has to be at least one dTD or schema , and there has to be other parameters
if (schemas.size() == 0) {
printUsage();
System.exit(1);
}
}
}
// process -i: instance files, if any
Vector ifiles = null;
if (i < argv.length) {
if (!arg.equals("-i")) {
printUsage();
System.exit(1);
}
i++;
ifiles = new Vector();
while (i < argv.length && !(arg = argv[i]).startsWith("-")) {
ifiles.addElement(arg);
i++;
}
// has to be at least one instance file, and there has to be no more
// parameters
if (ifiles.size() == 0 || i != argv.length) {
printUsage();
System.exit(1);
}
}
// now we have all our arguments. We only
// need to parse the DTD's/schemas, put them
// in a grammar pool, possibly instantiate an
// appropriate configuration, and we're on our way.
SymbolTable sym = new SymbolTable(BIG_PRIME);
XMLGrammarPreparser preparser = new XMLGrammarPreparser(sym);
XMLGrammarPoolImpl grammarPool = new XMLGrammarPoolImpl();
boolean isDTD = false;
if(externalDTDs != null) {
preparser.registerPreparser(XMLGrammarDescription.XML_DTD, null);
isDTD = true;
} else if(schemas != null) {
preparser.registerPreparser(XMLGrammarDescription.XML_SCHEMA, null);
isDTD = false;
} else {
System.err.println("No schema or DTD specified!");
System.exit(1);
}
preparser.setProperty(GRAMMAR_POOL, grammarPool);
preparser.setFeature(NAMESPACES_FEATURE_ID, true);
preparser.setFeature(VALIDATION_FEATURE_ID, true);
// note we can set schema features just in case...
preparser.setFeature(SCHEMA_VALIDATION_FEATURE_ID, true);
preparser.setFeature(SCHEMA_FULL_CHECKING_FEATURE_ID, schemaFullChecking);
preparser.setFeature(HONOUR_ALL_SCHEMA_LOCATIONS_ID, honourAllSchemaLocations);
// parse the grammar...
try {
if(isDTD) {
for (i = 0; i < externalDTDs.size(); i++) {
Grammar g = preparser.preparseGrammar(XMLGrammarDescription.XML_DTD, stringToXIS((String)externalDTDs.elementAt(i)));
// we don't really care about g; grammarPool will take care of everything.
}
} else { // must be schemas!
for (i = 0; i < schemas.size(); i++) {
Grammar g = preparser.preparseGrammar(XMLGrammarDescription.XML_SCHEMA, stringToXIS((String)schemas.elementAt(i)));
// we don't really care about g; grammarPool will take care of everything.
}
}
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
// Now we have a grammar pool and a SymbolTable; just
// build a configuration and we're on our way!
if (parserConfiguration == null) {
parserConfiguration = new XIncludeAwareParserConfiguration(sym, grammarPool);
}
else {
// set GrammarPool and SymbolTable...
parserConfiguration.setProperty(SYMBOL_TABLE, sym);
parserConfiguration.setProperty(GRAMMAR_POOL, grammarPool);
}
// now must reset features, unfortunately:
try{
parserConfiguration.setFeature(NAMESPACES_FEATURE_ID, true);
parserConfiguration.setFeature(VALIDATION_FEATURE_ID, true);
// now we can still do schema features just in case,
// so long as it's our configuraiton......
parserConfiguration.setFeature(SCHEMA_VALIDATION_FEATURE_ID, true);
parserConfiguration.setFeature(SCHEMA_FULL_CHECKING_FEATURE_ID, schemaFullChecking);
parserConfiguration.setFeature(HONOUR_ALL_SCHEMA_LOCATIONS_ID, honourAllSchemaLocations);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
// then for each instance file, try to validate it
if (ifiles != null) {
try {
for (i = 0; i < ifiles.size(); i++) {
parserConfiguration.parse(stringToXIS((String)ifiles.elementAt(i)));
}
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
| private static void | printUsage()Prints the usage.
System.err.println("usage: java xni.XMLGrammarBuilder [-p name] -d uri ... | [-f|-F] [-hs|-HS] -a uri ... [-i uri ...]");
System.err.println();
System.err.println("options:");
System.err.println(" -p name Select parser configuration by name to use for instance validation");
System.err.println(" -d Grammars to preparse are DTD external subsets");
System.err.println(" -f | -F Turn on/off Schema full checking (default "+
(DEFAULT_SCHEMA_FULL_CHECKING ? "on" : "off)"));
System.err.println(" -hs | -HS Turn on/off honouring of all schema locations (default "+
(DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONS ? "on" : "off)"));
System.err.println(" -a uri ... Provide a list of schema documents");
System.err.println(" -i uri ... Provide a list of instance documents to validate");
System.err.println();
System.err.println("NOTE: Both -d and -a cannot be specified!");
| private static org.apache.xerces.xni.parser.XMLInputSource | stringToXIS(java.lang.String uri)
return new XMLInputSource(null, uri, null);
|
|