/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package dom; import java.io.PrintWriter; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; /** * A sample DOM filter. This sample program illustrates how to * use the Document#getElementsByTagName() method to quickly * and easily locate elements by name. * * @author Jeffrey Rodriguez, IBM * @author Andy Clark, IBM * * @version $Id: GetElementsByTagName.java 447683 2006-09-19 02:36:31Z mrglavas $ */ public class GetElementsByTagName { // // Constants // // feature ids /** Namespaces feature id (http://xml.org/sax/features/namespaces). */ protected static final String NAMESPACES_FEATURE_ID = "http://xml.org/sax/features/namespaces"; /** Validation feature id (http://xml.org/sax/features/validation). */ protected static final String VALIDATION_FEATURE_ID = "http://xml.org/sax/features/validation"; /** Schema validation feature id (http://apache.org/xml/features/validation/schema). */ protected static final String SCHEMA_VALIDATION_FEATURE_ID = "http://apache.org/xml/features/validation/schema"; /** Schema full checking feature id (http://apache.org/xml/features/validation/schema-full-checking). */ protected static final String SCHEMA_FULL_CHECKING_FEATURE_ID = "http://apache.org/xml/features/validation/schema-full-checking"; /** Honour all schema locations feature id (http://apache.org/xml/features/honour-all-schemaLocations). */ protected static final String HONOUR_ALL_SCHEMA_LOCATIONS_ID = "http://apache.org/xml/features/honour-all-schemaLocations"; /** Validate schema annotations feature id (http://apache.org/xml/features/validate-annotations). */ protected static final String VALIDATE_ANNOTATIONS_ID = "http://apache.org/xml/features/validate-annotations"; /** Dynamic validation feature id (http://apache.org/xml/features/validation/dynamic). */ protected static final String DYNAMIC_VALIDATION_FEATURE_ID = "http://apache.org/xml/features/validation/dynamic"; /** XInclude feature id (http://apache.org/xml/features/xinclude). */ protected static final String XINCLUDE_FEATURE_ID = "http://apache.org/xml/features/xinclude"; /** XInclude fixup base URIs feature id (http://apache.org/xml/features/xinclude/fixup-base-uris). */ protected static final String XINCLUDE_FIXUP_BASE_URIS_FEATURE_ID = "http://apache.org/xml/features/xinclude/fixup-base-uris"; /** XInclude fixup language feature id (http://apache.org/xml/features/xinclude/fixup-language). */ protected static final String XINCLUDE_FIXUP_LANGUAGE_FEATURE_ID = "http://apache.org/xml/features/xinclude/fixup-language"; // default settings /** Default parser name (dom.wrappers.Xerces). */ protected static final String DEFAULT_PARSER_NAME = "dom.wrappers.Xerces"; /** Default element name (*). */ protected static final String DEFAULT_ELEMENT_NAME = "*"; /** Default namespaces support (true). */ protected static final boolean DEFAULT_NAMESPACES = true; /** Default validation support (false). */ protected static final boolean DEFAULT_VALIDATION = false; /** Default Schema validation support (false). */ protected static final boolean DEFAULT_SCHEMA_VALIDATION = false; /** Default Schema full checking support (false). */ protected static final boolean DEFAULT_SCHEMA_FULL_CHECKING = false; /** Default honour all schema locations (false). */ protected static final boolean DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONS = false; /** Default validate schema annotations (false). */ protected static final boolean DEFAULT_VALIDATE_ANNOTATIONS = false; /** Default dynamic validation support (false). */ protected static final boolean DEFAULT_DYNAMIC_VALIDATION = false; /** Default XInclude processing support (false). */ protected static final boolean DEFAULT_XINCLUDE = false; /** Default XInclude fixup base URIs support (true). */ protected static final boolean DEFAULT_XINCLUDE_FIXUP_BASE_URIS = true; /** Default XInclude fixup language support (true). */ protected static final boolean DEFAULT_XINCLUDE_FIXUP_LANGUAGE = true; // // Public static methods // /** Prints the specified elements in the given document. */ public static void print(PrintWriter out, Document document, String elementName, String attributeName) { // get elements that match NodeList elements = document.getElementsByTagName(elementName); // is there anything to do? if (elements == null) { return; } // print all elements if (attributeName == null) { int elementCount = elements.getLength(); for (int i = 0; i < elementCount; i++) { Element element = (Element)elements.item(i); print(out, element, element.getAttributes()); } } // print elements with given attribute name else { int elementCount = elements.getLength(); for (int i = 0; i < elementCount; i++) { Element element = (Element)elements.item(i); NamedNodeMap attributes = element.getAttributes(); if (attributes.getNamedItem(attributeName) != null) { print(out, element, attributes); } } } } // print(PrintWriter,Document,String,String) // // Protected static methods // /** Prints the specified element. */ protected static void print(PrintWriter out, Element element, NamedNodeMap attributes) { out.print('<'); out.print(element.getNodeName()); if (attributes != null) { int attributeCount = attributes.getLength(); for (int i = 0; i < attributeCount; i++) { Attr attribute = (Attr)attributes.item(i); out.print(' '); out.print(attribute.getNodeName()); out.print("=\""); out.print(normalize(attribute.getNodeValue())); out.print('"'); } } out.println('>'); out.flush(); } // print(PrintWriter,Element,NamedNodeMap) /** Normalizes the given string. */ protected static String normalize(String s) { StringBuffer str = new StringBuffer(); int len = (s != null) ? s.length() : 0; for (int i = 0; i < len; i++) { char ch = s.charAt(i); switch (ch) { case '<': { str.append("<"); break; } case '>': { str.append(">"); break; } case '&': { str.append("&"); break; } case '"': { str.append("""); break; } case '\r': case '\n': { str.append("&#"); str.append(Integer.toString(ch)); str.append(';'); break; } default: { str.append(ch); } } } return str.toString(); } // normalize(String):String // // MAIN // /** Main program entry point. */ public static void main(String argv[]) { // is there anything to do? if (argv.length == 0) { printUsage(); System.exit(1); } // variables PrintWriter out = new PrintWriter(System.out); ParserWrapper parser = null; String elementName = DEFAULT_ELEMENT_NAME; String attributeName = null; boolean namespaces = DEFAULT_NAMESPACES; boolean validation = DEFAULT_VALIDATION; boolean schemaValidation = DEFAULT_SCHEMA_VALIDATION; boolean schemaFullChecking = DEFAULT_SCHEMA_FULL_CHECKING; boolean honourAllSchemaLocations = DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONS; boolean validateAnnotations = DEFAULT_VALIDATE_ANNOTATIONS; boolean dynamicValidation = DEFAULT_DYNAMIC_VALIDATION; boolean xincludeProcessing = DEFAULT_XINCLUDE; boolean xincludeFixupBaseURIs = DEFAULT_XINCLUDE_FIXUP_BASE_URIS; boolean xincludeFixupLanguage = DEFAULT_XINCLUDE_FIXUP_LANGUAGE; // process arguments for (int i = 0; i < argv.length; i++) { String arg = argv[i]; if (arg.startsWith("-")) { String option = arg.substring(1); if (option.equals("p")) { // get parser name if (++i == argv.length) { System.err.println("error: Missing argument to -p option."); } String parserName = argv[i]; // create parser try { parser = (ParserWrapper)Class.forName(parserName).newInstance(); } catch (Exception e) { parser = null; System.err.println("error: Unable to instantiate parser ("+parserName+")"); } continue; } if (option.equals("e")) { if (++i == argv.length) { System.err.println("error: Missing argument to -e option."); } elementName = argv[i]; continue; } if (option.equals("a")) { if (++i == argv.length) { System.err.println("error: Missing argument to -a option."); } attributeName = argv[i]; continue; } if (option.equalsIgnoreCase("n")) { namespaces = option.equals("n"); continue; } if (option.equalsIgnoreCase("v")) { validation = option.equals("v"); continue; } if (option.equalsIgnoreCase("s")) { schemaValidation = option.equals("s"); continue; } if (option.equalsIgnoreCase("f")) { schemaFullChecking = option.equals("f"); continue; } if (option.equalsIgnoreCase("hs")) { honourAllSchemaLocations = option.equals("hs"); continue; } if (option.equalsIgnoreCase("va")) { validateAnnotations = option.equals("va"); continue; } if (option.equalsIgnoreCase("dv")) { dynamicValidation = option.equals("dv"); continue; } if (option.equalsIgnoreCase("xi")) { xincludeProcessing = option.equals("xi"); continue; } if (option.equalsIgnoreCase("xb")) { xincludeFixupBaseURIs = option.equals("xb"); continue; } if (option.equalsIgnoreCase("xl")) { xincludeFixupLanguage = option.equals("xl"); continue; } if (option.equals("h")) { printUsage(); continue; } } // use default parser? if (parser == null) { // create parser try { parser = (ParserWrapper)Class.forName(DEFAULT_PARSER_NAME).newInstance(); } catch (Exception e) { System.err.println("error: Unable to instantiate parser ("+DEFAULT_PARSER_NAME+")"); continue; } } // set parser features try { parser.setFeature(NAMESPACES_FEATURE_ID, namespaces); } catch (SAXException e) { System.err.println("warning: Parser does not support feature ("+NAMESPACES_FEATURE_ID+")"); } try { parser.setFeature(VALIDATION_FEATURE_ID, validation); } catch (SAXException e) { System.err.println("warning: Parser does not support feature ("+VALIDATION_FEATURE_ID+")"); } try { parser.setFeature(SCHEMA_VALIDATION_FEATURE_ID, schemaValidation); } catch (SAXException e) { System.err.println("warning: Parser does not support feature ("+SCHEMA_VALIDATION_FEATURE_ID+")"); } try { parser.setFeature(SCHEMA_FULL_CHECKING_FEATURE_ID, schemaFullChecking); } catch (SAXException e) { System.err.println("warning: Parser does not support feature ("+SCHEMA_FULL_CHECKING_FEATURE_ID+")"); } try { parser.setFeature(HONOUR_ALL_SCHEMA_LOCATIONS_ID, honourAllSchemaLocations); } catch (SAXException e) { System.err.println("warning: Parser does not support feature ("+HONOUR_ALL_SCHEMA_LOCATIONS_ID+")"); } try { parser.setFeature(VALIDATE_ANNOTATIONS_ID, validateAnnotations); } catch (SAXException e) { System.err.println("warning: Parser does not support feature ("+VALIDATE_ANNOTATIONS_ID+")"); } try { parser.setFeature(DYNAMIC_VALIDATION_FEATURE_ID, dynamicValidation); } catch (SAXException e) { System.err.println("warning: Parser does not support feature ("+DYNAMIC_VALIDATION_FEATURE_ID+")"); } try { parser.setFeature(XINCLUDE_FEATURE_ID, xincludeProcessing); } catch (SAXException e) { System.err.println("warning: Parser does not support feature ("+XINCLUDE_FEATURE_ID+")"); } try { parser.setFeature(XINCLUDE_FIXUP_BASE_URIS_FEATURE_ID, xincludeFixupBaseURIs); } catch (SAXException e) { System.err.println("warning: Parser does not support feature ("+XINCLUDE_FIXUP_BASE_URIS_FEATURE_ID+")"); } try { parser.setFeature(XINCLUDE_FIXUP_LANGUAGE_FEATURE_ID, xincludeFixupLanguage); } catch (SAXException e) { System.err.println("warning: Parser does not support feature ("+XINCLUDE_FIXUP_LANGUAGE_FEATURE_ID+")"); } // parse file try { Document document = parser.parse(arg); GetElementsByTagName.print(out, document, elementName, attributeName); } catch (SAXParseException e) { // ignore } catch (Exception e) { System.err.println("error: Parse error occurred - "+e.getMessage()); if (e instanceof SAXException) { Exception nested = ((SAXException)e).getException(); if (nested != null) { e = nested; } } e.printStackTrace(System.err); } } } // main(String[]) // // Private static methods // /** Prints the usage. */ private static void printUsage() { System.err.println("usage: java dom.GetElementsByTagName (options) uri ..."); System.err.println(); System.err.println("options:"); System.err.println(" -p name Select parser by name."); System.err.println(" -e name Specify element name for search."); System.err.println(" -a name Specify attribute name for specified elements."); System.err.println(" -n | -N Turn on/off namespace processing."); System.err.println(" -v | -V Turn on/off validation."); System.err.println(" -s | -S Turn on/off Schema validation support."); System.err.println(" NOTE: Not supported by all parsers."); System.err.println(" -f | -F Turn on/off Schema full checking."); System.err.println(" NOTE: Requires use of -s and not supported by all parsers."); System.err.println(" -hs | -HS Turn on/off honouring of all schema locations."); System.err.println(" NOTE: Requires use of -s and not supported by all parsers."); System.err.println(" -va | -VA Turn on/off validation of schema annotations."); System.err.println(" NOTE: Requires use of -s and not supported by all parsers."); System.err.println(" -dv | -DV Turn on/off dynamic validation."); System.err.println(" NOTE: Not supported by all parsers."); System.err.println(" -xi | -XI Turn on/off XInclude processing."); System.err.println(" NOTE: Not supported by all parsers."); System.err.println(" -xb | -XB Turn on/off base URI fixup during XInclude processing."); System.err.println(" NOTE: Requires use of -xi and not supported by all parsers."); System.err.println(" -xl | -XL Turn on/off language fixup during XInclude processing."); System.err.println(" NOTE: Requires use of -xi and not supported by all parsers."); System.err.println(" -h This help screen."); System.err.println(); System.err.println("defaults:"); System.err.println(" Parser: "+DEFAULT_PARSER_NAME); System.err.println(" Element: "+DEFAULT_ELEMENT_NAME); System.err.print(" Namespaces: "); System.err.println(DEFAULT_NAMESPACES ? "on" : "off"); System.err.print(" Validation: "); System.err.println(DEFAULT_VALIDATION ? "on" : "off"); System.err.print(" Schema: "); System.err.println(DEFAULT_SCHEMA_VALIDATION ? "on" : "off"); System.err.print(" Schema full checking: "); System.err.println(DEFAULT_SCHEMA_FULL_CHECKING ? "on" : "off"); System.err.print(" Honour all schema locations: "); System.err.println(DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONS ? "on" : "off"); System.err.print(" Validate annotations: "); System.err.println(DEFAULT_VALIDATE_ANNOTATIONS ? "on" : "off"); System.err.print(" Dynamic: "); System.err.println(DEFAULT_DYNAMIC_VALIDATION ? "on" : "off"); System.err.print(" XInclude: "); System.err.println(DEFAULT_XINCLUDE ? "on" : "off"); System.err.print(" XInclude base URI fixup: "); System.err.println(DEFAULT_XINCLUDE_FIXUP_BASE_URIS ? "on" : "off"); System.err.print(" XInclude language fixup: "); System.err.println(DEFAULT_XINCLUDE_FIXUP_LANGUAGE ? "on" : "off"); } // printUsage() } // class GetElementsByTagName