⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doparse.java

📁 kaffe Java 解释器语言,源码,Java的子集系统,开放源代码
💻 JAVA
字号:
/* * Copyright (C) 1999-2001 David Brownell *  * This file is part of GNU JAXP, a library. * * GNU JAXP is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. *  * GNU JAXP is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License.  */package gnu.xml.util;import java.io.*;import org.xml.sax.*;import org.xml.sax.helpers.XMLReaderFactory;import org.xml.sax.ext.*;// import gnu.xml.pipeline.*;// Added imports directly to fix a GCJ problem.import gnu.xml.pipeline.CallFilter;import gnu.xml.pipeline.DomConsumer;import gnu.xml.pipeline.EventConsumer;import gnu.xml.pipeline.EventFilter;import gnu.xml.pipeline.LinkFilter;import gnu.xml.pipeline.NSFilter;import gnu.xml.pipeline.PipelineFactory;import gnu.xml.pipeline.TeeConsumer;import gnu.xml.pipeline.TextConsumer;import gnu.xml.pipeline.ValidationConsumer;import gnu.xml.pipeline.WellFormednessFilter;import gnu.xml.pipeline.XIncludeFilter;import gnu.xml.pipeline.XsltFilter;/** * This class provides a driver which may be invoked from the command line * to process a document using a SAX2 parser and a specified XML processing * pipeline. * This facilitates some common types of command line tools, such as parsing an * XML document in order test it for well formedness or validity. * * <p>The SAX2 XMLReaderFactory should return a SAX2 XML parser which * supports both of the standardized extension handlers (for declaration * and lexical events).  That parser will be used to produce events. * * <p>The first parameter to the command gives the name of the document that * will be given to that processor.  If it is a file name, it is converted * to a URL first. * * <p>The second parameter describes a simple processing pipeline, and will * be used as input to {@link gnu.xml.pipeline.PipelineFactory} * methods which identify the processing to be done.  Examples of such a * pipeline include <pre> * *    nsfix | validate                <em>to validate the input document </em> *    nsfix | write ( stdout )        <em>to echo the file as XML text</em> *    dom | nsfix | write ( stdout )  <em>parse into DOM, print the result</em> * </pre> * * <p> Relatively complex pipelines can be described on the command line, but * not all interesting ones will require as little configuration as can be done * in that way.  Put filters like "nsfix", perhaps followed by "validate", * at the front of the pipeline so they can be optimized out if a parser * supports those modes natively. * * <p> If the parsing is aborted for any reason, the JVM will exit with a * failure code.  If a validating parse was done then both validation and * well formedness errors will cause a failure.  A non-validating parse * will report failure on well formedness errors. * * @see gnu.xml.pipeline.PipelineFactory * * @author David Brownell */final public class DoParse{    private DoParse () { /* no instances allowed */ }    // first reported nonrecoverable error    private static SAXParseException	fatal;    // error categories    private static int			errorCount;    private static int			fatalCount;    /**     * Command line invoker for this class; pass a filename or URL     * as the first argument, and a pipeline description as the second.     * Make sure to use filters to condition the input to stages that     * require it; an <em>nsfix</em> filter will be a common requirement,     * to restore syntax that SAX2 parsers delete by default.  Some     * conditioning filters may be eliminated by setting parser options.     * (For example, "nsfix" can set the "namespace-prefixes" feature to     * a non-default value of "true".  In the same way, "validate" can set     * the "validation" feature to "true".)     */    public static void main (String argv [])    throws IOException    {	int		exitStatus = 1;	if (argv.length != 2) {	    System.err.println ("Usage: DoParse [filename|URL] pipeline-spec");	    System.err.println ("Example pipeline specs:");	    System.err.println ("  'nsfix | validate'");	    System.err.println (		"       ... restore namespace syntax, validate");	    System.err.println ("  'nsfix | write ( stdout )'");	    System.err.println (		"       ... restore namespace syntax, write to stdout as XML"		);	    System.exit (1);	}	try {	    //	    // Get input source for specified document (or try ;-)	    //	    argv [0] = Resolver.getURL (argv [0]);	    InputSource input = new InputSource (argv [0]);	    //	    // Get the producer, using the system default parser (which	    // can be overridden for this particular invocation).	    //	    // And the pipeline, using commandline options.	    //	    XMLReader		producer;	    EventConsumer	consumer;	    producer = XMLReaderFactory.createXMLReader ();	    //	    // XXX pipeline factory now has a pre-tokenized input	    // method, use it ... that way at least some params	    // can be written using quotes (have spaces, ...)	    //	    consumer = PipelineFactory.createPipeline (argv [1]);	    //	    // XXX want commandline option for tweaking error handler.	    // Want to be able to present warnings.	    //	    producer.setErrorHandler (new MyErrorHandler ());	    // XXX need facility enabling resolving to local DTDs	    //	    // Parse.  The pipeline may get optimized a bit, so we	    // can't always fail cleanly for validation without taking	    // a look at the filter stages.	    //	    EventFilter.bind (producer, consumer);	    producer.parse (input);	    try {		if (producer.getFeature (			"http://org.xml/sax/features/validation"))		    exitStatus = ((errorCount + fatalCount) > 0) ? 1 : 0;		else if (fatalCount == 0)		    exitStatus = 0;	    } catch (SAXException e) {		if (hasValidator (consumer))		    exitStatus = ((errorCount + fatalCount) > 0) ? 1 : 0;		else if (fatalCount == 0)		    exitStatus = 0;	    }	} catch (java.net.MalformedURLException e) {	    System.err.println ("** Malformed URL: " + e.getMessage ());	    System.err.println ("Is '" + argv [0] + "' a non-existent file?");	    e.printStackTrace ();		// e.g. FNF	} catch (SAXParseException e) {	    if (e != fatal) {		System.err.print (printParseException ("Parsing Aborted", e));		e.printStackTrace ();		if (e.getException () != null) {		    System.err.println ("++ Wrapped exception:");		    e.getException ().printStackTrace ();		}	    }	} catch (SAXException e) {	    Exception	x = e;	    if (e.getException () != null)		x = e.getException ();	    x.printStackTrace ();	} catch (Throwable t) {	    t.printStackTrace ();	}	System.exit (exitStatus);    }    // returns true if saw a validator (before end or unrecognized node)    // false otherwise    private static boolean hasValidator (EventConsumer e)    {	if (e == null)	    return false;	if (e instanceof ValidationConsumer)	    return true;	if (e instanceof TeeConsumer) {	    TeeConsumer	t = (TeeConsumer) e;	    return hasValidator (t.getFirst ())		|| hasValidator (t.getRest ());	}	if (e instanceof WellFormednessFilter		|| e instanceof NSFilter		)	    return hasValidator (((EventFilter)e).getNext ());		// else ... gee, we can't know.  Assume not.	return false;    }    static class MyErrorHandler implements ErrorHandler    {	// dump validation errors, but continue	public void error (SAXParseException e)	throws SAXParseException	{	    errorCount++;	    System.err.print (printParseException ("Error", e));	}	public void warning (SAXParseException e)	throws SAXParseException	{	    // System.err.print (printParseException ("Warning", e));	}	// try to continue fatal errors, in case a parser reports more	public void fatalError (SAXParseException e)	throws SAXParseException	{	    fatalCount++;	    if (fatal == null)		fatal = e;	    System.err.print (printParseException ("Nonrecoverable Error", e));	}    }    static private String printParseException (	String			label,	SAXParseException	e    ) {	StringBuffer	buf = new StringBuffer ();	int		temp;	buf.append ("** ");	buf.append (label);	buf.append (": ");	buf.append (e.getMessage ());	buf.append ('\n');	if (e.getSystemId () != null) {	    buf.append ("   URI:  ");	    buf.append (e.getSystemId ());	    buf.append ('\n');	}	if ((temp = e.getLineNumber ()) != -1) {	    buf.append ("   line: ");	    buf.append (temp);	    buf.append ('\n');	}	if ((temp = e.getColumnNumber ()) != -1) {	    buf.append ("   char: ");	    buf.append (temp);	    buf.append ('\n');	}	return buf.toString ();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -