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

📄 xppreader.java

📁 Java的面向对象数据库系统的源代码
💻 JAVA
字号:
/* * Copyright 2001 (C) MetaStuff, Ltd. All Rights Reserved. *  * This software is open source.  * See the bottom of this file for the licence. *  * $Id: XPPReader.java,v 1.2 2003/06/10 16:18:34 per_nyfelt Exp $ */package org.dom4j.io;import org.dom4j.*;import org.dom4j.tree.DelegateDocumentFactory;import org.dom4j.xpp.ProxyXmlStartTag;import org.gjt.xpp.XmlEndTag;import org.gjt.xpp.XmlPullParser;import org.gjt.xpp.XmlPullParserException;import org.gjt.xpp.XmlPullParserFactory;import java.io.*;import java.net.URL;/** <p><code>XPPReader</code> is a Reader of DOM4J documents that   * uses the fast   * <a href="http://www.extreme.indiana.edu/soap/xpp/">XML Pull Parser 2.x</a>.  * It does not currently support comments, CDATA or ProcessingInstructions or  * validation but it is very fast for use in SOAP style environments.</p>  *  * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>  * @version $Revision: 1.2 $  */public class XPPReader {    /** <code>NodeFactory</code> used to create new document objects */    private NodeFactory factory;        /** <code>XmlPullParser</code> used to parse XML */    private XmlPullParser xppParser;        /** <code>XmlPullParser</code> used to parse XML */    private XmlPullParserFactory xppFactory;        /** DispatchHandler to call when each <code>Element</code> is encountered */    private DispatchHandler dispatchHandler;                 public XPPReader() {    }    /**     * @deprecated  Use XPPReader(NodeFactory) instead     */    public XPPReader(DocumentFactory factory) {        this.factory = factory;    }    public XPPReader(NodeFactory factory) {        this.factory = factory;    }                /** <p>Reads a Document from the given <code>File</code></p>      *      * @param file is the <code>File</code> to read from.      * @return the newly created Document instance      * @throws DocumentException if an error occurs during parsing.      * @throws IOException if a URL could not be made for the given File      */    public Document read(File file) throws DocumentException, IOException, XmlPullParserException {        String systemID = file.getAbsolutePath();        return read( new BufferedReader( new FileReader( file ) ), systemID );    }        /** <p>Reads a Document from the given <code>URL</code></p>      *      * @param url <code>URL</code> to read from.      * @return the newly created Document instance      * @throws DocumentException if an error occurs during parsing.      */    public Document read(URL url) throws DocumentException, IOException, XmlPullParserException {        String systemID = url.toExternalForm();        return read( createReader( url.openStream() ), systemID);    }        /** <p>Reads a Document from the given URL or filename.</p>      *      * <p>      * If the systemID contains a <code>':'</code> character then it is      * assumed to be a URL otherwise its assumed to be a file name.      * If you want finer grained control over this mechansim then please      * explicitly pass in either a {@link URL} or a {@link File} instance      * instead of a {@link String} to denote the source of the document.      * </p>      *      * @param systemID is a URL for a document or a file name.      * @return the newly created Document instance      * @throws DocumentException if an error occurs during parsing.      * @throws IOException if a URL could not be made for the given File      */    public Document read(String systemID) throws DocumentException, IOException, XmlPullParserException {        if ( systemID.indexOf( ':' ) >= 0 ) {            // lets assume its a URL            return read(new URL(systemID));        }        else {            // lets assume that we are given a file name            return read( new File(systemID) );        }    }    /** <p>Reads a Document from the given stream</p>      *      * @param in <code>InputStream</code> to read from.      * @return the newly created Document instance      * @throws DocumentException if an error occurs during parsing.      */    public Document read(InputStream in) throws DocumentException, IOException, XmlPullParserException {        return read( createReader( in ) );    }    /** <p>Reads a Document from the given <code>Reader</code></p>      *      * @param reader is the reader for the input      * @return the newly created Document instance      * @throws DocumentException if an error occurs during parsing.      */    public Document read(Reader reader) throws DocumentException, IOException, XmlPullParserException {        getXPPParser().setInput(reader);        return parseDocument();    }    /** <p>Reads a Document from the given array of characters</p>      *      * @param text is the text to parse      * @return the newly created Document instance      * @throws DocumentException if an error occurs during parsing.      */    public Document read(char[] text) throws DocumentException, IOException, XmlPullParserException {        getXPPParser().setInput(text);        return parseDocument();    }    /** <p>Reads a Document from the given stream</p>      *      * @param in <code>InputStream</code> to read from.      * @param systemID is the URI for the input      * @return the newly created Document instance      * @throws DocumentException if an error occurs during parsing.      */    public Document read(InputStream in, String systemID) throws DocumentException, IOException, XmlPullParserException {        return read( createReader( in ), systemID );    }    /** <p>Reads a Document from the given <code>Reader</code></p>      *      * @param reader is the reader for the input      * @param systemID is the URI for the input      * @return the newly created Document instance      * @throws DocumentException if an error occurs during parsing.      */    public Document read(Reader reader, String systemID) throws DocumentException, IOException, XmlPullParserException {        Document document = read( reader );        document.setName( systemID );        return document;    }        // Properties    //-------------------------------------------------------------------------                    public XmlPullParser getXPPParser() throws XmlPullParserException {        if ( xppParser == null ) {            xppParser = getXPPFactory().newPullParser();        }        return xppParser;    }        public XmlPullParserFactory getXPPFactory() throws XmlPullParserException {        if ( xppFactory == null ) {            xppFactory = XmlPullParserFactory.newInstance();        }        return xppFactory;    }    public void setXPPFactory(XmlPullParserFactory xppFactory) {        this.xppFactory = xppFactory;    }        /**      * @return the <code>DocumentFactory</code> used to create document objects     * @deprecated  Use getNodeFactory() instead.     */    public DocumentFactory getDocumentFactory() {        DocumentFactory result = null;                NodeFactory nodeFactory = getNodeFactory();        if (nodeFactory instanceof DocumentFactory) {            result = (DocumentFactory) nodeFactory;        } else {            XPathFactory xpathFactory = DocumentFactory.getInstance();            result = new DelegateDocumentFactory(nodeFactory, xpathFactory);        }                return result;    }    public NodeFactory getNodeFactory() {        if (factory == null) {            factory = DocumentFactory.getInstance();        }                return factory;    }    /** <p>This sets the <code>DocumentFactory</code> used to create new documents.      * This method allows the building of custom DOM4J tree objects to be implemented      * easily using a custom derivation of {@link DocumentFactory}</p>      *      * @param factory <code>DocumentFactory</code> used to create DOM4J objects     * @deprecated  Use setNodeFactory(NodeFactory) instead     */    public void setDocumentFactory(DocumentFactory factory) {        this.factory = factory;    }    public void setNodeFactory(NodeFactory factory) {        this.factory = factory;    }        /** Adds the <code>ElementHandler</code> to be called when the       * specified path is encounted.      *      * @param path is the path to be handled      * @param handler is the <code>ElementHandler</code> to be called      * by the event based processor.      */    public void addHandler(String path, ElementHandler handler) {        getDispatchHandler().addHandler(path, handler);       }        /** Removes the <code>ElementHandler</code> from the event based      * processor, for the specified path.      *      * @param path is the path to remove the <code>ElementHandler</code> for.      */    public void removeHandler(String path) {        getDispatchHandler().removeHandler(path);       }        /** When multiple <code>ElementHandler</code> instances have been       * registered, this will set a default <code>ElementHandler</code>      * to be called for any path which does <b>NOT</b> have a handler      * registered.      * @param handler is the <code>ElementHandler</code> to be called      * by the event based processor.      */    public void setDefaultHandler(ElementHandler handler) {        getDispatchHandler().setDefaultHandler(handler);       }        // Implementation methods        //-------------------------------------------------------------------------                        protected Document parseDocument() throws DocumentException, IOException, XmlPullParserException {        Document document = getNodeFactory().createDocument();        Element parent = null;        XmlPullParser xppParser = getXPPParser();        xppParser.setNamespaceAware(true);        ProxyXmlStartTag startTag = new ProxyXmlStartTag();        XmlEndTag endTag = xppFactory.newEndTag();        while (true) {            int type = xppParser.next();            switch (type) {                case XmlPullParser.END_DOCUMENT: {                    return document;                }                case XmlPullParser.START_TAG: {                    xppParser.readStartTag( startTag );                    Element newElement = startTag.getElement();                    if ( parent != null ) {                        parent.add( newElement );                    }                    else {                        document.add( newElement );                    }                    parent = newElement;                    break;                }                case XmlPullParser.END_TAG: {                    xppParser.readEndTag( endTag );                    if (parent != null) {                        parent = parent.getParent();                    }                    break;                }                case XmlPullParser.CONTENT: {                    String text = xppParser.readContent();                    if ( parent != null ) {                        parent.addText( text );                    }                    else {                        throw new DocumentException( "Cannot have text content outside of the root document" );                    }                    break;                }                default: {                    throw new DocumentException( "Error: unknown PullParser type: " + type );                }            }        }    }    protected DispatchHandler getDispatchHandler() {        if (dispatchHandler == null) {            dispatchHandler = new DispatchHandler();        }        return dispatchHandler;       }        protected void setDispatchHandler(DispatchHandler dispatchHandler) {        this.dispatchHandler = dispatchHandler;    }        /** Factory method to create a Reader from the given InputStream.     */    protected Reader createReader(InputStream in) throws IOException {        return new BufferedReader( new InputStreamReader( in ) );    }    }/* * Redistribution and use of this software and associated documentation * ("Software"), with or without modification, are permitted provided * that the following conditions are met: * * 1. Redistributions of source code must retain copyright *    statements and notices.  Redistributions must also contain a *    copy of this document. * * 2. Redistributions in binary form must reproduce the *    above copyright notice, this list of conditions and the *    following disclaimer in the documentation and/or other *    materials provided with the distribution. * * 3. The name "DOM4J" must not be used to endorse or promote *    products derived from this Software without prior written *    permission of MetaStuff, Ltd.  For written permission, *    please contact dom4j-info@metastuff.com. * * 4. Products derived from this Software may not be called "DOM4J" *    nor may "DOM4J" appear in their names without prior written *    permission of MetaStuff, Ltd. DOM4J is a registered *    trademark of MetaStuff, Ltd. * * 5. Due credit should be given to the DOM4J Project *    (http://dom4j.org/). * * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL * METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright 2001 (C) MetaStuff, Ltd. All Rights Reserved. * * $Id: XPPReader.java,v 1.2 2003/06/10 16:18:34 per_nyfelt Exp $ */

⌨️ 快捷键说明

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