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

📄 xml11nsdocumentscannerimpl.java

📁 java1.6众多例子参考
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                    fCurrentElement.rawname,                    fAttributeQName.rawname });        }        fEntityScanner.skipSpaces();        // content        int attrIndex;        if (fBindNamespaces) {            attrIndex = attributes.getLength();            attributes.addAttributeNS(                fAttributeQName,                XMLSymbols.fCDATASymbol,                null);        } else {            int oldLen = attributes.getLength();            attrIndex =                attributes.addAttribute(                    fAttributeQName,                    XMLSymbols.fCDATASymbol,                    null);            // WFC: Unique Att Spec            if (oldLen == attributes.getLength()) {                reportFatalError(                    "AttributeNotUnique",                    new Object[] {                        fCurrentElement.rawname,                        fAttributeQName.rawname });            }        }        //REVISIT: one more case needs to be included: external PE and standalone is no        boolean isVC = fHasExternalDTD && !fStandalone;        // REVISIT: it seems that this function should not take attributes, and length        scanAttributeValue(            this.fTempString,            fTempString2,            fAttributeQName.rawname,            isVC,            fCurrentElement.rawname);        String value = fTempString.toString();        attributes.setValue(attrIndex, value);        attributes.setNonNormalizedValue(attrIndex, fTempString2.toString());        attributes.setSpecified(attrIndex, true);        // record namespace declarations if any.        if (fBindNamespaces) {            String localpart = fAttributeQName.localpart;            String prefix =                fAttributeQName.prefix != null                    ? fAttributeQName.prefix                    : XMLSymbols.EMPTY_STRING;            // when it's of form xmlns="..." or xmlns:prefix="...",            // it's a namespace declaration. but prefix:xmlns="..." isn't.            if (prefix == XMLSymbols.PREFIX_XMLNS                || prefix == XMLSymbols.EMPTY_STRING                && localpart == XMLSymbols.PREFIX_XMLNS) {                // get the internalized value of this attribute                String uri = fSymbolTable.addSymbol(value);                // 1. "xmlns" can't be bound to any namespace                if (prefix == XMLSymbols.PREFIX_XMLNS                    && localpart == XMLSymbols.PREFIX_XMLNS) {                    fErrorReporter.reportError(                        XMLMessageFormatter.XMLNS_DOMAIN,                        "CantBindXMLNS",                        new Object[] { fAttributeQName },                        XMLErrorReporter.SEVERITY_FATAL_ERROR);                }                // 2. the namespace for "xmlns" can't be bound to any prefix                if (uri == NamespaceContext.XMLNS_URI) {                    fErrorReporter.reportError(                        XMLMessageFormatter.XMLNS_DOMAIN,                        "CantBindXMLNS",                        new Object[] { fAttributeQName },                        XMLErrorReporter.SEVERITY_FATAL_ERROR);                }                // 3. "xml" can't be bound to any other namespace than it's own                if (localpart == XMLSymbols.PREFIX_XML) {                    if (uri != NamespaceContext.XML_URI) {                        fErrorReporter.reportError(                            XMLMessageFormatter.XMLNS_DOMAIN,                            "CantBindXML",                            new Object[] { fAttributeQName },                            XMLErrorReporter.SEVERITY_FATAL_ERROR);                    }                }                // 4. the namespace for "xml" can't be bound to any other prefix                else {                    if (uri == NamespaceContext.XML_URI) {                        fErrorReporter.reportError(                            XMLMessageFormatter.XMLNS_DOMAIN,                            "CantBindXML",                            new Object[] { fAttributeQName },                            XMLErrorReporter.SEVERITY_FATAL_ERROR);                    }                }                prefix =                    localpart != XMLSymbols.PREFIX_XMLNS                        ? localpart                        : XMLSymbols.EMPTY_STRING;                // Declare prefix in context. Removing the association between a prefix and a                 // namespace name is permitted in XML 1.1, so if the uri value is the empty string,                 // the prefix is being unbound. -- mrglavas                fNamespaceContext.declarePrefix(                    prefix,                    uri.length() != 0 ? uri : null);                // bind namespace attribute to a namespace                attributes.setURI(                    attrIndex,                    fNamespaceContext.getURI(XMLSymbols.PREFIX_XMLNS));            } else {                // attempt to bind attribute                if (fAttributeQName.prefix != null) {                    attributes.setURI(                        attrIndex,                        fNamespaceContext.getURI(fAttributeQName.prefix));                }            }        }        if (DEBUG_START_END_ELEMENT)            System.out.println("<<< scanAttribute()");    } // scanAttribute(XMLAttributes)    /**     * Scans an end element.     * <p>     * <pre>     * [42] ETag ::= '&lt;/' Name S? '>'     * </pre>     * <p>     * <strong>Note:</strong> This method uses the fElementQName variable.     * The contents of this variable will be destroyed. The caller should     * copy the needed information out of this variable before calling     * this method.     *     * @return The element depth.     */    protected int scanEndElement() throws IOException, XNIException {        if (DEBUG_START_END_ELEMENT)            System.out.println(">>> scanEndElement()");        // pop context        QName endElementName = fElementStack.popElement();                        // Take advantage of the fact that next string _should_ be "fElementQName.rawName",        //In scanners most of the time is consumed on checks done for XML characters, we can        // optimize on it and avoid the checks done for endElement,        //we will also avoid symbol table lookup - neeraj.bajaj@sun.com        // this should work both for namespace processing true or false...        //REVISIT: if the string is not the same as expected.. we need to do better error handling..        //We can skip this for now... In any case if the string doesn't match -- document is not well formed.                if (!fEntityScanner.skipString(endElementName.rawname)) {             reportFatalError(                "ETagRequired",                new Object[] { endElementName.rawname });        }        // end        fEntityScanner.skipSpaces();        if (!fEntityScanner.skipChar('>')) {            reportFatalError(                "ETagUnterminated",                new Object[] { endElementName.rawname });        }        fMarkupDepth--;        //we have increased the depth for two markup "<" characters        fMarkupDepth--;        // check that this element was opened in the same entity        if (fMarkupDepth < fEntityStack[fEntityDepth - 1]) {            reportFatalError(                "ElementEntityMismatch",                 new Object[] { endElementName.rawname });        }                // call handler        if (fDocumentHandler != null) {            fDocumentHandler.endElement(endElementName, null);                       /*if (fBindNamespaces) {                fNamespaceContext.popContext();            }*/                    }                if(dtdGrammarUtil != null)            dtdGrammarUtil.endElement(endElementName);                return fMarkupDepth;    } // scanEndElement():int    public void reset(XMLComponentManager componentManager)        throws XMLConfigurationException {        super.reset(componentManager);        fPerformValidation = false;        fBindNamespaces = false;    }    /** Creates a content Driver. */    protected Driver createContentDriver() {        return new NS11ContentDriver();    } // createContentDriver():Driver        /** return the next state on the input     *     * @return int     */        public int next() throws IOException, XNIException {        //since namespace context should still be valid when the parser is at the end element state therefore        //we pop the context only when next() has been called after the end element state was encountered. - nb.                if((fScannerLastState == XMLEvent.END_ELEMENT) && fBindNamespaces){            fScannerLastState = -1;            fNamespaceContext.popContext();        }                return fScannerLastState = super.next();    }            /**     * Driver to handle content scanning.     */    protected final class NS11ContentDriver extends ContentDriver {        /**         * Scan for root element hook. This method is a hook for         * subclasses to add code that handles scanning for the root         * element. This method will also attempt to remove DTD validator         * from the pipeline, if there is no DTD grammar. If DTD validator         * is no longer in the pipeline bind namespaces in the scanner.         *         *         * @return True if the caller should stop and return true which         *          allows the scanner to switch to a new scanning         *          Driver. A return value of false indicates that         *          the content Driver should continue as normal.         */        protected boolean scanRootElementHook()            throws IOException, XNIException {                        if (fExternalSubsetResolver != null && !fSeenDoctypeDecl                 && !fDisallowDoctype && (fValidation || fLoadExternalDTD)) {                scanStartElementName();                resolveExternalSubsetAndRead();                reconfigurePipeline();                if (scanStartElementAfterName()) {                    setScannerState(SCANNER_STATE_TRAILING_MISC);                    setDriver(fTrailingMiscDriver);                    return true;                }            }            else {                reconfigurePipeline();                if (scanStartElement()) {                    setScannerState(SCANNER_STATE_TRAILING_MISC);                    setDriver(fTrailingMiscDriver);                    return true;                }            }            return false;        } // scanRootElementHook():boolean                /**         * Re-configures pipeline by removing the DTD validator          * if no DTD grammar exists. If no validator exists in the         * pipeline or there is no DTD grammar, namespace binding         * is performed by the scanner in the enclosing class.         */        private void reconfigurePipeline() {            if (fDTDValidator == null) {                fBindNamespaces = true;            }            else if (!fDTDValidator.hasGrammar()) {                fBindNamespaces = true;                fPerformValidation = fDTDValidator.validate();                // re-configure pipeline                XMLDocumentSource source = fDTDValidator.getDocumentSource();                XMLDocumentHandler handler = fDTDValidator.getDocumentHandler();                source.setDocumentHandler(handler);                if (handler != null)                    handler.setDocumentSource(source);                fDTDValidator.setDocumentSource(null);                fDTDValidator.setDocumentHandler(null);            }        } // reconfigurePipeline()    }}

⌨️ 快捷键说明

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