xmlscanner.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 1,453 行 · 第 1/4 页

JAVA
1,453
字号
                        fEntityScanner.scanChar();                    }                }            } while (fEntityScanner.scanData("?>", fStringBuffer));        }        data.setValues(fStringBuffer);    } // scanPIData(String,XMLString)    /**     * Scans a comment.     * <p>     * <pre>     * [15] Comment ::= '&lt!--' ((Char - '-') | ('-' (Char - '-')))* '-->'     * </pre>     * <p>     * <strong>Note:</strong> Called after scanning past '&lt;!--'     * <strong>Note:</strong> This method uses fString, anything in it     * at the time of calling is lost.     *     * @param text The buffer to fill in with the text.     */    protected void scanComment(XMLStringBuffer text)        throws IOException, XNIException {        // text        // REVISIT: handle invalid character, eof        text.clear();        while (fEntityScanner.scanData("--", text)) {            int c = fEntityScanner.peekChar();            if (c != -1) {                if (XMLChar.isHighSurrogate(c)) {                    scanSurrogates(text);                }                else if (isInvalidLiteral(c)) {                    reportFatalError("InvalidCharInComment",                                     new Object[] { Integer.toHexString(c) });                     fEntityScanner.scanChar();                }            }         }        if (!fEntityScanner.skipChar('>')) {            reportFatalError("DashDashInComment", null);        }    } // scanComment()    /**     * Scans an attribute value and normalizes whitespace converting all     * whitespace characters to space characters.     *      * [10] AttValue ::= '"' ([^<&"] | Reference)* '"' | "'" ([^<&'] | Reference)* "'"     *     * @param value The XMLString to fill in with the value.     * @param nonNormalizedValue The XMLString to fill in with the      *                           non-normalized value.     * @param atName The name of the attribute being parsed (for error msgs).     * @param checkEntities true if undeclared entities should be reported as VC violation,       *                      false if undeclared entities should be reported as WFC violation.     * @param eleName The name of element to which this attribute belongs.     *     * <strong>Note:</strong> This method uses fStringBuffer2, anything in it     * at the time of calling is lost.     **/    protected void scanAttributeValue(XMLString value,                                       XMLString nonNormalizedValue,                                      String atName,                                      boolean checkEntities,String eleName)        throws IOException, XNIException    {        // quote        int quote = fEntityScanner.peekChar();        if (quote != '\'' && quote != '"') {			reportFatalError("OpenQuoteExpected", new Object[]{eleName,atName});        }        fEntityScanner.scanChar();        int entityDepth = fEntityDepth;        int c = fEntityScanner.scanLiteral(quote, value);        if (DEBUG_ATTR_NORMALIZATION) {            System.out.println("** scanLiteral -> \""                               + value.toString() + "\"");        }        fStringBuffer2.clear();        fStringBuffer2.append(value);        normalizeWhitespace(value);        if (DEBUG_ATTR_NORMALIZATION) {            System.out.println("** normalizeWhitespace -> \""                               + value.toString() + "\"");        }        if (c != quote) {            fScanningAttribute = true;            fStringBuffer.clear();            do {                fStringBuffer.append(value);                if (DEBUG_ATTR_NORMALIZATION) {                    System.out.println("** value2: \""                                       + fStringBuffer.toString() + "\"");                }                if (c == '&') {                    fEntityScanner.skipChar('&');                    if (entityDepth == fEntityDepth) {                        fStringBuffer2.append('&');                    }                    if (fEntityScanner.skipChar('#')) {                        if (entityDepth == fEntityDepth) {                            fStringBuffer2.append('#');                        }                        int ch = scanCharReferenceValue(fStringBuffer, fStringBuffer2);                        if (ch != -1) {                            if (DEBUG_ATTR_NORMALIZATION) {                                System.out.println("** value3: \""                                                   + fStringBuffer.toString()                                                   + "\"");                            }                        }                    }                    else {                        String entityName = fEntityScanner.scanName();                        if (entityName == null) {                            reportFatalError("NameRequiredInReference", null);                        }                        else if (entityDepth == fEntityDepth) {                            fStringBuffer2.append(entityName);                        }                        if (!fEntityScanner.skipChar(';')) {                            reportFatalError("SemicolonRequiredInReference",                                             new Object []{entityName});                        }                        else if (entityDepth == fEntityDepth) {                            fStringBuffer2.append(';');                        }                        if (entityName == fAmpSymbol) {                            fStringBuffer.append('&');                            if (DEBUG_ATTR_NORMALIZATION) {                                System.out.println("** value5: \""                                                   + fStringBuffer.toString()                                                   + "\"");                            }                        }                        else if (entityName == fAposSymbol) {                            fStringBuffer.append('\'');                            if (DEBUG_ATTR_NORMALIZATION) {                                System.out.println("** value7: \""                                                   + fStringBuffer.toString()                                                   + "\"");                            }                        }                        else if (entityName == fLtSymbol) {                            fStringBuffer.append('<');                            if (DEBUG_ATTR_NORMALIZATION) {                                System.out.println("** value9: \""                                                   + fStringBuffer.toString()                                                   + "\"");                            }                        }                        else if (entityName == fGtSymbol) {                            fStringBuffer.append('>');                            if (DEBUG_ATTR_NORMALIZATION) {                                System.out.println("** valueB: \""                                                   + fStringBuffer.toString()                                                   + "\"");                            }                        }                        else if (entityName == fQuotSymbol) {                            fStringBuffer.append('"');                            if (DEBUG_ATTR_NORMALIZATION) {                                System.out.println("** valueD: \""                                                   + fStringBuffer.toString()                                                   + "\"");                            }                        }                        else {                            if (fEntityManager.isExternalEntity(entityName)) {                                reportFatalError("ReferenceToExternalEntity",                                                 new Object[] { entityName });                            }                            else {                                if (!fEntityManager.isDeclaredEntity(entityName)) {                                    //WFC & VC: Entity Declared                                    if (checkEntities) {                                        if (fValidation) {                                            fErrorReporter.reportError(XMLMessageFormatter.XML_DOMAIN,                                                                       "EntityNotDeclared",                                                                       new Object[]{entityName},                                                                       XMLErrorReporter.SEVERITY_ERROR);                                        }                                    }                                    else {                                        reportFatalError("EntityNotDeclared",                                                         new Object[]{entityName});                                    }                                }                                fEntityManager.startEntity(entityName, true);                            }                        }                    }                }                else if (c == '<') {                    reportFatalError("LessthanInAttValue",									 new Object[] { eleName, atName });                    fEntityScanner.scanChar();                    if (entityDepth == fEntityDepth) {                        fStringBuffer2.append((char)c);                    }                }                else if (c == '%' || c == ']') {                    fEntityScanner.scanChar();                    fStringBuffer.append((char)c);                    if (entityDepth == fEntityDepth) {                        fStringBuffer2.append((char)c);                    }                    if (DEBUG_ATTR_NORMALIZATION) {                        System.out.println("** valueF: \""                                           + fStringBuffer.toString() + "\"");                    }                }                else if (c == '\n' || c == '\r') {                    fEntityScanner.scanChar();                    fStringBuffer.append(' ');                    if (entityDepth == fEntityDepth) {                        fStringBuffer2.append('\n');                    }                }                else if (c != -1 && XMLChar.isHighSurrogate(c)) {                    fStringBuffer3.clear();                    if (scanSurrogates(fStringBuffer3)) {                        fStringBuffer.append(fStringBuffer3);                        if (entityDepth == fEntityDepth) {                            fStringBuffer2.append(fStringBuffer3);                        }                        if (DEBUG_ATTR_NORMALIZATION) {                            System.out.println("** valueI: \""                                               + fStringBuffer.toString()                                               + "\"");                        }                    }                }                else if (c != -1 && isInvalidLiteral(c)) {                    reportFatalError("InvalidCharInAttValue",					new Object[] {eleName, atName, Integer.toString(c, 16)});                    fEntityScanner.scanChar();                    if (entityDepth == fEntityDepth) {                        fStringBuffer2.append((char)c);                    }                }                c = fEntityScanner.scanLiteral(quote, value);                if (entityDepth == fEntityDepth) {                    fStringBuffer2.append(value);                }                normalizeWhitespace(value);            } while (c != quote || entityDepth != fEntityDepth);            fStringBuffer.append(value);            if (DEBUG_ATTR_NORMALIZATION) {                System.out.println("** valueN: \""                                   + fStringBuffer.toString() + "\"");            }            value.setValues(fStringBuffer);            fScanningAttribute = false;        }        nonNormalizedValue.setValues(fStringBuffer2);        // quote        int cquote = fEntityScanner.scanChar();        if (cquote != quote) {			reportFatalError("CloseQuoteExpected", new Object[]{eleName,atName});        }    } // scanAttributeValue()    /**     * Scans External ID and return the public and system IDs.     *     * @param identifiers An array of size 2 to return the system id,     *                    and public id (in that order).     * @param optionalSystemId Specifies whether the system id is optional.     *     * <strong>Note:</strong> This method uses fString and fStringBuffer,     * anything in them at the time of calling is lost.     */    protected void scanExternalID(String[] identifiers,                                  boolean optionalSystemId)        throws IOException, XNIException {        String systemId = null;        String publicId = null;        if (fEntityScanner.skipString("PUBLIC")) {            if (!fEntityScanner.skipSpaces()) {                reportFatalError("SpaceRequiredAfterPUBLIC", null);            }            scanPubidLiteral(fString);            publicId = fString.toString();            if (!fEntityScanner.skipSpaces() && !optionalSystemId) {                reportFatalError("SpaceRequiredBetweenPublicAndSystem", null);            }        }        if (publicId != null || fEntityScanner.skipString("SYSTEM")) {            if (publicId == null && !fEntityScanner.skipSpaces()) {                reportFatalError("SpaceRequiredAfterSYSTEM", null);            }            int quote = fEntityScanner.peekChar();            if (quote != '\'' && quote != '"') {                if (publicId != null && optionalSystemId) {                    // looks like we don't have any system id                    // simply return the public id                    identifiers[0] = null;                    identifiers[1] = publicId;                    return;                }                reportFatalError("QuoteRequiredInSystemID", null);            }            fEntityScanner.scanChar();            XMLString ident = fString;            if (fEntityScanner.scanLiteral(quote, ident) != quote) {                fStringBuffer.clear();                do {                    fStringBuffer.append(ident);                    int c = fEntityScanner.peekChar();                    if (XMLChar.isMarkup(c) || c == ']') {                        fStringBuffer.append((char)fEntityScanner.scanChar());                    }                } while (fEntityScanner.scanLiteral(quote, ident) != quote);                fStringBuffer.append(ident);                ident = fStringBuffer;            }            systemId = ident.toString();            if (!fEntityScanner.skipChar(quote)) {                reportFatalError("SystemIDUnterminated", null);            }        }        // store result in array        identifiers[0] = systemId;        identifiers[1] = publicId;    }    /**     * Scans public ID literal.     *     * [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"      * [13] PubidChar::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]     *     * The returned string is normalized according to the following rule,     * from http://www.w3.org/TR/REC-xml#dt-pubid:     *     * Before a match is attempted, all strings of white space in the public     * identifier must be normalized to single space characters (#x20), and     * leading and trailing white space must be removed.     *     * @param literal The string to fill in with the public ID literal.     * @return True on success.     *     * <strong>Note:</strong> This method uses fStringBuffer, anything in it at     * the time of calling is lost.     */    protected boolean scanPubidLiteral(XMLString literal)        throws IOException, XNIException    {        int quote = fEntityScanner.scanChar();        if (quote != '\'' && quote != '"') {

⌨️ 快捷键说明

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