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

📄 xmlwriter.java

📁 基于Jabber协议的即时消息服务器
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
            }            else if ( node instanceof Comment) {                textOnly = false;            }        }        writeAttributes(element);        lastOutputNodeType = Node.ELEMENT_NODE;        if ( size <= 0 ) {            writeEmptyElementClose(qualifiedName);        }        else {            writer.write(">");            if ( textOnly ) {                // we have at least one text node so lets assume                // that its non-empty                writeElementContent(element);            }            else {                // we know it's not null or empty from above                ++indentLevel;                writeElementContent(element);                --indentLevel;                writePrintln();                indent();            }            writer.write("</");            writer.write(qualifiedName);            writer.write(">");        }        // remove declared namespaceStack from stack        while (namespaceStack.size() > previouslyDeclaredNamespaces) {            namespaceStack.pop();        }        lastOutputNodeType = Node.ELEMENT_NODE;    }    /**     * Determines if element is a special case of XML elements     * where it contains an xml:space attribute of "preserve".     * If it does, then retain whitespace.     */    protected final boolean isElementSpacePreserved(Element element) {      final Attribute attr = (Attribute)element.attribute("space");      boolean preserveFound=preserve; //default to global state      if (attr!=null) {        if ("xml".equals(attr.getNamespacePrefix()) &&            "preserve".equals(attr.getText())) {          preserveFound = true;        }        else {          preserveFound = false;        }      }      return preserveFound;    }    /** Outputs the content of the given element. If whitespace trimming is     * enabled then all adjacent text nodes are appended together before     * the whitespace trimming occurs to avoid problems with multiple     * text nodes being created due to text content that spans parser buffers     * in a SAX parser.     */    protected void writeElementContent(Element element) throws IOException {        boolean trim = format.isTrimText();        boolean oldPreserve=preserve;        if (trim) { //verify we have to before more expensive test          preserve=isElementSpacePreserved(element);          trim = !preserve;        }        if (trim) {            // concatenate adjacent text nodes together            // so that whitespace trimming works properly            Text lastTextNode = null;            StringBuilder buffer = null;            boolean textOnly = true;            for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {                Node node = element.node(i);                if ( node instanceof Text ) {                    if ( lastTextNode == null ) {                        lastTextNode = (Text) node;                    }                    else {                        if (buffer == null) {                            buffer = new StringBuilder( lastTextNode.getText() );                        }                      buffer.append( ((Text) node).getText() );                    }                }                else {                    if (!textOnly && format.isPadText()) {                        writer.write(PAD_TEXT);                    }                    textOnly = false;                    if ( lastTextNode != null ) {                        if ( buffer != null ) {                            writeString( buffer.toString() );                            buffer = null;                        }                        else {                            writeString( lastTextNode.getText() );                        }                        lastTextNode = null;                        if (format.isPadText()) {                            writer.write(PAD_TEXT);                        }                    }                    writeNode(node);                }            }            if ( lastTextNode != null ) {                if (!textOnly && format.isPadText()) {                    writer.write(PAD_TEXT);                }                if ( buffer != null ) {                    writeString( buffer.toString() );                    buffer = null;                }                else {                    writeString( lastTextNode.getText() );                }                lastTextNode = null;            }        }        else {            Node lastTextNode = null;            for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {                Node node = element.node(i);                if (node instanceof Text) {                    writeNode(node);                    lastTextNode = node;                } else {                    if ((lastTextNode != null) && format.isPadText()) {                        writer.write(PAD_TEXT);                    }                    writeNode(node);                    if ((lastTextNode != null) && format.isPadText()) {                        writer.write(PAD_TEXT);                    }                    lastTextNode = null;                }            }        }        preserve=oldPreserve;    }    protected void writeCDATA(String text) throws IOException {        writer.write( "<![CDATA[" );        if (text != null) {        	writer.write( text );        }        writer.write( "]]>" );        lastOutputNodeType = Node.CDATA_SECTION_NODE;    }    protected void writeDocType(DocumentType docType) throws IOException {        if (docType != null) {            docType.write( writer );            //writeDocType( docType.getElementName(), docType.getPublicID(), docType.getSystemID() );            writePrintln();        }    }    protected void writeNamespace(Namespace namespace) throws IOException {        if ( namespace != null ) {            writeNamespace(namespace.getPrefix(), namespace.getURI());        }    }    /**     * Writes the SAX namepsaces     */    protected void writeNamespaces() throws IOException {        if ( namespacesMap != null ) {            for ( Iterator iter = namespacesMap.entrySet().iterator(); iter.hasNext(); ) {                Map.Entry entry = (Map.Entry) iter.next();                String prefix = (String) entry.getKey();                String uri = (String) entry.getValue();                writeNamespace(prefix, uri);            }            namespacesMap = null;        }    }    /**     * Writes the SAX namepsaces     */    protected void writeNamespace(String prefix, String uri) throws IOException {        if ( prefix != null && prefix.length() > 0 ) {            writer.write(" xmlns:");            writer.write(prefix);            writer.write("=\"");        }        else {            writer.write(" xmlns=\"");        }        writer.write(uri);        writer.write("\"");    }    protected void writeProcessingInstruction(ProcessingInstruction processingInstruction) throws IOException {        //indent();        writer.write( "<?" );        writer.write( processingInstruction.getName() );        writer.write( " " );        writer.write( processingInstruction.getText() );        writer.write( "?>" );        writePrintln();        lastOutputNodeType = Node.PROCESSING_INSTRUCTION_NODE;    }    protected void writeString(String text) throws IOException {        if ( text != null && text.length() > 0 ) {            if ( escapeText ) {                text = escapeElementEntities(text);            }//            if (format.isPadText()) {//                if (lastOutputNodeType == Node.ELEMENT_NODE) {//                    writer.write(PAD_TEXT);//                }//            }            if (format.isTrimText()) {                boolean first = true;                StringTokenizer tokenizer = new StringTokenizer(text);                while (tokenizer.hasMoreTokens()) {                    String token = tokenizer.nextToken();                    if ( first ) {                        first = false;                        if ( lastOutputNodeType == Node.TEXT_NODE ) {                            writer.write(" ");                        }                    }                    else {                        writer.write(" ");                    }                    writer.write(token);                    lastOutputNodeType = Node.TEXT_NODE;                }            }            else {                lastOutputNodeType = Node.TEXT_NODE;                writer.write(text);            }        }    }    /**     * This method is used to write out Nodes that contain text     * and still allow for xml:space to be handled properly.     *     */    protected void writeNodeText(Node node) throws IOException {        String text = node.getText();        if (text != null && text.length() > 0) {            if (escapeText) {                text = escapeElementEntities(text);            }            lastOutputNodeType = Node.TEXT_NODE;            writer.write(text);        }    }    protected void writeNode(Node node) throws IOException {        int nodeType = node.getNodeType();        switch (nodeType) {            case Node.ELEMENT_NODE:                writeElement((Element) node);                break;            case Node.ATTRIBUTE_NODE:                writeAttribute((Attribute) node);                break;            case Node.TEXT_NODE:                writeNodeText(node);                //write((Text) node);                break;            case Node.CDATA_SECTION_NODE:                writeCDATA(node.getText());                break;            case Node.ENTITY_REFERENCE_NODE:                writeEntity((Entity) node);                break;            case Node.PROCESSING_INSTRUCTION_NODE:                writeProcessingInstruction((ProcessingInstruction) node);                break;            case Node.COMMENT_NODE:                writeComment(node.getText());                break;            case Node.DOCUMENT_NODE:                write((Document) node);                break;            case Node.DOCUMENT_TYPE_NODE:                writeDocType((DocumentType) node);                break;            case Node.NAMESPACE_NODE:                // Will be output with attributes                //write((Namespace) node);                break;            default:                throw new IOException( "Invalid node type: " + node );        }    }    protected void installLexicalHandler() {        XMLReader parent = getParent();        if (parent == null) {            throw new NullPointerException("No parent for filter");        }        // try to register for lexical events        for (int i = 0; i < LEXICAL_HANDLER_NAMES.length; i++) {            try {                parent.setProperty(LEXICAL_HANDLER_NAMES[i], this);                break;            }            catch (SAXNotRecognizedException ex) {                // ignore            }            catch (SAXNotSupportedException ex) {                // ignore            }        }    }    protected void writeDocType(String name, String publicID, String systemID) throws IOException {        boolean hasPublic = false;        writer.write("<!DOCTYPE ");        writer.write(name);        if ((publicID != null) && (!publicID.equals(""))) {            writer.write(" PUBLIC \"");            writer.write(publicID);            writer.write("\"");            hasPublic = true;        }        if ((systemID != null) && (!systemID.equals(""))) {            if (!hasPublic) {                writer.write(" SYSTEM");            }            writer.write(" \"");            writer.write(systemID);            writer.write("\"");        }        writer.write(">");        writePrintln();    }    protected void writeEntity(Entity entity) throws IOException {        if (!resolveEntityRefs()) {            writeEntityRef( entity.getName() );        } else {            writer.write(entity.getText());        }    }    protected void writeEntityRef(String name) throws IOException {        writer.write( "&" );        writer.write( name );

⌨️ 快捷键说明

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