schemadom.java

来自「JAVA 所有包」· Java 代码 · 共 450 行 · 第 1/2 页

JAVA
450
字号
        } else      //capturing character calls            fAnnotationBuffer.append("</").append(elemName.rawname).append(">");    }        void endSyntheticAnnotationElement(QName elemName, boolean complete) {        if(complete) {            fAnnotationBuffer.append("\n</").append(elemName.rawname).append(">");            // note that this is always called after endElement on <annotation>'s            // child and before endElement on annotation.            // hence, we must make this the child of the current            // parent's only child.            parent.fSyntheticAnnotation = fAnnotationBuffer.toString();                        // apparently, there is no sensible way of resetting            // these things            fAnnotationBuffer = null;        } else      //capturing character calls            fAnnotationBuffer.append("</").append(elemName.rawname).append(">");    }        void startAnnotationCDATA() {        inCDATA = true;        fAnnotationBuffer.append("<![CDATA[");    }        void endAnnotationCDATA() {        fAnnotationBuffer.append("]]>");        inCDATA = false;    }        private void resizeRelations() {        NodeImpl[][] temp = new NodeImpl[relations.length+relationsRowResizeFactor][];        System.arraycopy(relations, 0, temp, 0, relations.length);        for (int i = relations.length ; i < temp.length ; i++) {            temp[i] = new NodeImpl[relationsColResizeFactor];        }        relations = temp;    }        private void resizeRelations(int i) {        NodeImpl[] temp = new NodeImpl[relations[i].length+relationsColResizeFactor];        System.arraycopy(relations[i], 0, temp, 0, relations[i].length);        relations[i] = temp;    }            public void reset() {                // help out the garbage collector        if(relations != null)             for(int i=0; i<relations.length; i++)                 for(int j=0; j<relations[i].length; j++)                     relations[i][j] = null;        relations = new NodeImpl[relationsRowResizeFactor][];        parent = new ElementImpl(0, 0, 0);        parent.rawname = "DOCUMENT_NODE";        currLoc = 0;        nextFreeLoc = 1;        inCDATA = false;        for (int i=0; i<relationsRowResizeFactor; i++) {            relations[i] = new NodeImpl[relationsColResizeFactor];        }        relations[currLoc][0] = parent;    }            public void printDOM() {        /*         for (int i=0; i<relations.length; i++) {         if (relations[i][0] != null) {         for (int j=0; j<relations[i].length; j++) {         if (relations[i][j] != null) {         System.out.print(relations[i][j].nodeType+"-"+relations[i][j].parentRow+"  ");         }         }         System.out.println("");         }         }         */        //traverse(getDocumentElement(), 0);    }            // debug methods        public static void traverse(Node node, int depth) {        indent(depth);        System.out.print("<"+node.getNodeName());                if (node.hasAttributes()) {            NamedNodeMap attrs = node.getAttributes();            for (int i=0; i<attrs.getLength(); i++) {                System.out.print("  "+((Attr)attrs.item(i)).getName()+"=\""+((Attr)attrs.item(i)).getValue()+"\"");            }        }                if (node.hasChildNodes()) {            System.out.println(">");            depth+=4;            for (Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {                traverse(child, depth);            }            depth-=4;            indent(depth);            System.out.println("</"+node.getNodeName()+">");        }        else {            System.out.println("/>");        }    }        public static void indent(int amount) {        for (int i = 0; i < amount; i++) {            System.out.print(' ');        }    }        // org.w3c.dom methods    public Element getDocumentElement() {        // this returns a parent node, known to be an ElementImpl        return (ElementImpl)relations[0][1];    }        // commence the serialization of an annotation    void startAnnotation(QName elemName, XMLAttributes attributes,            NamespaceContext namespaceContext) {        if(fAnnotationBuffer == null) fAnnotationBuffer = new StringBuffer(256);        fAnnotationBuffer.append("<").append(elemName.rawname).append(" ");                // attributes are a bit of a pain.  To get this right, we have to keep track        // of the namespaces we've seen declared, then examine the namespace context        // for other namespaces so that we can also include them.        // optimized for simplicity and the case that not many        // namespaces are declared on this annotation...        Vector namespaces = new Vector();        for (int i = 0; i < attributes.getLength(); ++i) {            String aValue = attributes.getValue(i);            String aPrefix = attributes.getPrefix(i);            String aQName = attributes.getQName(i);            // if it's xmlns:* or xmlns, must be a namespace decl            if (aPrefix == XMLSymbols.PREFIX_XMLNS || aQName == XMLSymbols.PREFIX_XMLNS) {                namespaces.addElement(aPrefix == XMLSymbols.PREFIX_XMLNS ?                         attributes.getLocalName(i) : XMLSymbols.EMPTY_STRING);            }            fAnnotationBuffer.append(aQName).append("=\"").append(processAttValue(aValue)).append("\" ");        }        // now we have to look through currently in-scope namespaces to see what        // wasn't declared here        Enumeration currPrefixes = namespaceContext.getAllPrefixes();        while(currPrefixes.hasMoreElements()) {            String prefix = (String)currPrefixes.nextElement();            String uri = namespaceContext.getURI(prefix);            if (uri == null) {                uri = XMLSymbols.EMPTY_STRING;            }            if (!namespaces.contains(prefix)) {                // have to declare this one                if(prefix == XMLSymbols.EMPTY_STRING) {                    fAnnotationBuffer.append("xmlns").append("=\"").append(processAttValue(uri)).append("\" ");                }                else {                    fAnnotationBuffer.append("xmlns:").append(prefix).append("=\"").append(processAttValue(uri)).append("\" ");                }            }        }        fAnnotationBuffer.append(">\n");    }    void startAnnotationElement(QName elemName, XMLAttributes attributes) {        fAnnotationBuffer.append("<").append(elemName.rawname);        for(int i=0; i<attributes.getLength(); i++) {            String aValue = attributes.getValue(i);            fAnnotationBuffer.append(" ").append(attributes.getQName(i)).append("=\"").append(processAttValue(aValue)).append("\"");        }        fAnnotationBuffer.append(">");    }        private static String processAttValue(String original) {        final int length = original.length();        // normally, nothing will happen        for (int i = 0; i < length; ++i) {            char currChar = original.charAt(i);            if (currChar == '"' || currChar == '<' || currChar == '&' ||                    currChar == 0x09 || currChar == 0x0A || currChar == 0x0D) {                return escapeAttValue(original, i);            }        }        return original;    }        private static String escapeAttValue(String original, int from) {        int i;        final int length = original.length();        StringBuffer newVal = new StringBuffer(length);        newVal.append(original.substring(0, from));        for (i = from; i < length; ++i) {            char currChar = original.charAt(i);            if (currChar == '"') {                newVal.append("&quot;");            }             else if (currChar == '<') {                newVal.append("&lt;");            }            else if (currChar == '&') {                newVal.append("&amp;");            }            // Must escape 0x09, 0x0A and 0x0D if they appear in attribute            // value so that they may be round-tripped. They would otherwise            // be transformed to a 0x20 during attribute value normalization.            else if (currChar == 0x09) {                newVal.append("&#x9;");            }            else if (currChar == 0x0A) {                newVal.append("&#xA;");            }            else if (currChar == 0x0D) {                newVal.append("&#xD;");            }            else {                newVal.append(currChar);            }        }        return newVal.toString();    }}

⌨️ 快捷键说明

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