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

📄 xml11nsdocumentscannerimpl.java

📁 java1.6众多例子参考
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 1999-2003 The Apache Software Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * * 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 end-user documentation included with the redistribution, *    if any, must include the following acknowledgment: *       "This product includes software developed by the *        Apache Software Foundation (http://www.apache.org/)." *    Alternately, this acknowledgment may appear in the software itself, *    if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xerces" and "Apache Software Foundation" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", *    nor may "Apache" appear in their name, without prior written *    permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``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 THE APACHE SOFTWARE FOUNDATION 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. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 2002, International * Business Machines, Inc., http://www.apache.org.  For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package com.sun.org.apache.xerces.internal.impl;import java.io.IOException;import com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidatorFilter;import com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter;import com.sun.org.apache.xerces.internal.util.XMLAttributesImpl;import com.sun.org.apache.xerces.internal.util.XMLSymbols;import com.sun.org.apache.xerces.internal.xni.NamespaceContext;import com.sun.org.apache.xerces.internal.xni.QName;import com.sun.org.apache.xerces.internal.xni.XMLDocumentHandler;import com.sun.org.apache.xerces.internal.xni.XNIException;import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager;import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException;import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentSource;import javax.xml.stream.events.XMLEvent;/** * The scanner acts as the source for the document * information which is communicated to the document handler. * * This class scans an XML document, checks if document has a DTD, and if * DTD is not found the scanner will remove the DTD Validator from the pipeline and perform * namespace binding. * * Note: This scanner should only be used when the namespace processing is on! * * <p> * This component requires the following features and properties from the * component manager that uses it: * <ul> *  <li>http://xml.org/sax/features/namespaces {true} -- if the value of this *      feature is set to false this scanner must not be used.</li> *  <li>http://xml.org/sax/features/validation</li> *  <li>http://apache.org/xml/features/nonvalidating/load-external-dtd</li> *  <li>http://apache.org/xml/features/scanner/notify-char-refs</li> *  <li>http://apache.org/xml/features/scanner/notify-builtin-refs</li> *  <li>http://apache.org/xml/properties/internal/symbol-table</li> *  <li>http://apache.org/xml/properties/internal/error-reporter</li> *  <li>http://apache.org/xml/properties/internal/entity-manager</li> *  <li>http://apache.org/xml/properties/internal/dtd-scanner</li> * </ul> *  * @xerces.internal * * @author Elena Litani, IBM * @author Michael Glavassevich, IBM * @author Sunitha Reddy, Sun Microsystems * @version $Id: XML11NSDocumentScannerImpl.java,v 1.3 2005/10/03 14:55:33 sunithareddy Exp $ */public class XML11NSDocumentScannerImpl extends XML11DocumentScannerImpl {    /**      * If is true, the dtd validator is no longer in the pipeline     * and the scanner should bind namespaces      */    protected boolean fBindNamespaces;    /**      * If validating parser, make sure we report an error in the     *  scanner if DTD grammar is missing.     */    protected boolean fPerformValidation;    // private data    //    /** DTD validator */    private XMLDTDValidatorFilter fDTDValidator;        /**      * Saw spaces after element name or between attributes.     *      * This is reserved for the case where scanning of a start element spans     * several methods, as is the case when scanning the start of a root element      * where a DTD external subset may be read after scanning the element name.     */    private boolean fSawSpace;        /**     * The scanner is responsible for removing DTD validator     * from the pipeline if it is not needed.     *      * @param validator the DTD validator from the pipeline     */    public void setDTDValidator(XMLDTDValidatorFilter validator) {        fDTDValidator = validator;    }    /**     * Scans a start element. This method will handle the binding of     * namespace information and notifying the handler of the start     * of the element.     * <p>     * <pre>     * [44] EmptyElemTag ::= '&lt;' Name (S Attribute)* S? '/>'     * [40] STag ::= '&lt;' Name (S Attribute)* S? '>'     * </pre>     * <p>     * <strong>Note:</strong> This method assumes that the leading     * '&lt;' character has been consumed.     * <p>     * <strong>Note:</strong> This method uses the fElementQName and     * fAttributes variables. The contents of these variables will be     * destroyed. The caller should copy important information out of     * these variables before calling this method.     *     * @return True if element is empty. (i.e. It matches     *          production [44].     */    protected boolean scanStartElement() throws IOException, XNIException {                if (DEBUG_START_END_ELEMENT)            System.out.println(">>> scanStartElementNS()");                // Note: namespace processing is on by default        fEntityScanner.scanQName(fElementQName);        // REVISIT - [Q] Why do we need this local variable? -- mrglavas        String rawname = fElementQName.rawname;        if (fBindNamespaces) {            fNamespaceContext.pushContext();            if (fScannerState == SCANNER_STATE_ROOT_ELEMENT) {                if (fPerformValidation) {                    fErrorReporter.reportError(                        XMLMessageFormatter.XML_DOMAIN,                        "MSG_GRAMMAR_NOT_FOUND",                        new Object[] { rawname },                        XMLErrorReporter.SEVERITY_ERROR);                    if (fDoctypeName == null                        || !fDoctypeName.equals(rawname)) {                        fErrorReporter.reportError(                            XMLMessageFormatter.XML_DOMAIN,                            "RootElementTypeMustMatchDoctypedecl",                            new Object[] { fDoctypeName, rawname },                            XMLErrorReporter.SEVERITY_ERROR);                    }                }            }        }        // push element stack        fCurrentElement = fElementStack.pushElement(fElementQName);        // attributes        boolean empty = false;        fAttributes.removeAllAttributes();        do {            // spaces            boolean sawSpace = fEntityScanner.skipSpaces();            // end tag?            int c = fEntityScanner.peekChar();            if (c == '>') {                fEntityScanner.scanChar();                break;            } else if (c == '/') {                fEntityScanner.scanChar();                if (!fEntityScanner.skipChar('>')) {                    reportFatalError(                        "ElementUnterminated",                        new Object[] { rawname });                }                empty = true;                break;            } else if (!isValidNameStartChar(c) || !sawSpace) {                // Second chance. Check if this character is a high                // surrogate of a valid name start character.                if (!isValidNameStartHighSurrogate(c) || !sawSpace) {                    reportFatalError(                        "ElementUnterminated",                        new Object[] { rawname });                }            }            // attributes            scanAttribute(fAttributes);            if (fSecurityManager != null && fAttributes.getLength() > fElementAttributeLimit){                                fErrorReporter.reportError(XMLMessageFormatter.XML_DOMAIN,                                             "ElementAttributeLimit",                                             new Object[]{rawname, new Integer(fElementAttributeLimit) },                                             XMLErrorReporter.SEVERITY_FATAL_ERROR );            }                   } while (true);        if (fBindNamespaces) {            // REVISIT: is it required? forbit xmlns prefix for element            if (fElementQName.prefix == XMLSymbols.PREFIX_XMLNS) {                fErrorReporter.reportError(                    XMLMessageFormatter.XMLNS_DOMAIN,                    "ElementXMLNSPrefix",                    new Object[] { fElementQName.rawname },                    XMLErrorReporter.SEVERITY_FATAL_ERROR);            }            // bind the element            String prefix =                fElementQName.prefix != null                    ? fElementQName.prefix                    : XMLSymbols.EMPTY_STRING;            // assign uri to the element            fElementQName.uri = fNamespaceContext.getURI(prefix);            // make sure that object in the element stack is updated as well            fCurrentElement.uri = fElementQName.uri;            if (fElementQName.prefix == null && fElementQName.uri != null) {                fElementQName.prefix = XMLSymbols.EMPTY_STRING;                // making sure that the object in the element stack is updated too.                fCurrentElement.prefix = XMLSymbols.EMPTY_STRING;            }            if (fElementQName.prefix != null && fElementQName.uri == null) {                fErrorReporter.reportError(                    XMLMessageFormatter.XMLNS_DOMAIN,                    "ElementPrefixUnbound",                    new Object[] {                        fElementQName.prefix,                        fElementQName.rawname },                    XMLErrorReporter.SEVERITY_FATAL_ERROR);            }            // bind attributes (xmlns are already bound bellow)            int length = fAttributes.getLength();            for (int i = 0; i < length; i++) {                fAttributes.getName(i, fAttributeQName);                String aprefix =                    fAttributeQName.prefix != null                        ? fAttributeQName.prefix                        : XMLSymbols.EMPTY_STRING;                String uri = fNamespaceContext.getURI(aprefix);                // REVISIT: try removing the first "if" and see if it is faster.                //                if (fAttributeQName.uri != null                    && fAttributeQName.uri == uri) {                    continue;                }                if (aprefix != XMLSymbols.EMPTY_STRING) {                    fAttributeQName.uri = uri;                    if (uri == null) {                        fErrorReporter.reportError(                            XMLMessageFormatter.XMLNS_DOMAIN,                            "AttributePrefixUnbound",                            new Object[] {                                fElementQName.rawname,                                fAttributeQName.rawname,                                aprefix },                            XMLErrorReporter.SEVERITY_FATAL_ERROR);                    }                    fAttributes.setURI(i, uri);

⌨️ 快捷键说明

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