📄 xmlserializer.java
字号:
_printer.flush(); } //------------------------------------------// // SAX document handler serializing methods // //------------------------------------------// public void startElement( String tagName, AttributeList attrs ) throws SAXException { int i; boolean preserveSpace; ElementState state; String name; String value; try { if ( _printer == null ) throw new IllegalStateException( "SER002 No writer supplied for serializer" ); state = getElementState(); if ( isDocumentState() ) { // If this is the root element handle it differently. // If the first root element in the document, serialize // the document's DOCTYPE. Space preserving defaults // to that of the output format. if ( ! _started ) startDocument( tagName ); } else { // For any other element, if first in parent, then // close parent's opening tag and use the parnet's // space preserving. if ( state.empty ) _printer.printText( '>' ); // Must leave CData section first if ( state.inCData ) { _printer.printText( "]]>" ); state.inCData = false; } // Indent this element on a new line if the first // content of the parent element or immediately // following an element. if ( _indenting && ! state.preserveSpace && ( state.empty || state.afterElement || state.afterComment) ) _printer.breakLine(); } preserveSpace = state.preserveSpace; // Do not change the current element state yet. // This only happens in endElement(). _printer.printText( '<' ); _printer.printText( tagName ); _printer.indent(); // For each attribute print it's name and value as one part, // separated with a space so the element can be broken on // multiple lines. if ( attrs != null ) { for ( i = 0 ; i < attrs.getLength() ; ++i ) { _printer.printSpace(); name = attrs.getName( i ); value = attrs.getValue( i ); if ( value != null ) { _printer.printText( name ); _printer.printText( "=\"" ); printEscaped( value ); _printer.printText( '"' ); } // If the attribute xml:space exists, determine whether // to preserve spaces in this and child nodes based on // its value. if ( name.equals( "xml:space" ) ) { if ( value.equals( "preserve" ) ) preserveSpace = true; else preserveSpace = _format.getPreserveSpace(); } } } // Now it's time to enter a new element state // with the tag name and space preserving. // We still do not change the curent element state. state = enterElementState( null, null, tagName, preserveSpace ); state.doCData = _format.isCDataElement( tagName ); state.unescaped = _format.isNonEscapingElement( tagName ); } catch ( IOException except ) { throw new SAXException( except ); } } public void endElement( String tagName ) throws SAXException { endElement( null, null, tagName ); } //------------------------------------------// // Generic node serializing methods methods // //------------------------------------------// /** * Called to serialize the document's DOCTYPE by the root element. * The document type declaration must name the root element, * but the root element is only known when that element is serialized, * and not at the start of the document. * <p> * This method will check if it has not been called before ({@link #_started}), * will serialize the document type declaration, and will serialize all * pre-root comments and PIs that were accumulated in the document * (see {@link #serializePreRoot()}). Pre-root will be serialized even if * this is not the first root element of the document. */ protected void startDocument( String rootTagName ) throws IOException { int i; String dtd; dtd = _printer.leaveDTD(); if ( ! _started ) { if ( ! _format.getOmitXMLDeclaration() ) { StringBuffer buffer; // Serialize the document declaration appreaing at the head // of very XML document (unless asked not to). buffer = new StringBuffer( "<?xml version=\"" ); if ( _format.getVersion() != null ) buffer.append( _format.getVersion() ); else buffer.append( "1.0" ); buffer.append( '"' ); if ( _format.getEncoding() != null ) { buffer.append( " encoding=\"" ); buffer.append( _format.getEncoding() ); buffer.append( '"' ); } if ( _format.getStandalone() && _docTypeSystemId == null && _docTypePublicId == null ) buffer.append( " standalone=\"yes\"" ); buffer.append( "?>" ); _printer.printText( buffer ); _printer.breakLine(); } if ( ! _format.getOmitDocumentType() ) { if ( _docTypeSystemId != null ) { // System identifier must be specified to print DOCTYPE. // If public identifier is specified print 'PUBLIC // <public> <system>', if not, print 'SYSTEM <system>'. _printer.printText( "<!DOCTYPE " ); _printer.printText( rootTagName ); if ( _docTypePublicId != null ) { _printer.printText( " PUBLIC " ); printDoctypeURL( _docTypePublicId ); if ( _indenting ) { _printer.breakLine(); for ( i = 0 ; i < 18 + rootTagName.length() ; ++i ) _printer.printText( " " ); } else _printer.printText( " " ); printDoctypeURL( _docTypeSystemId ); } else { _printer.printText( " SYSTEM " ); printDoctypeURL( _docTypeSystemId ); } // If we accumulated any DTD contents while printing. // this would be the place to print it. if ( dtd != null && dtd.length() > 0 ) { _printer.printText( " [" ); printText( dtd, true, true ); _printer.printText( ']' ); } _printer.printText( ">" ); _printer.breakLine(); } else if ( dtd != null && dtd.length() > 0 ) { _printer.printText( "<!DOCTYPE " ); _printer.printText( rootTagName ); _printer.printText( " [" ); printText( dtd, true, true ); _printer.printText( "]>" ); _printer.breakLine(); } } } _started = true; // Always serialize these, even if not te first root element. serializePreRoot(); } /** * Called to serialize a DOM element. Equivalent to calling {@link * #startElement(String, String, String, Attributes)}, {@link #endElement(String, String, String)} and serializing everything * inbetween, but better optimized. */ protected void serializeElement( Element elem ) throws IOException { Attr attr; NamedNodeMap attrMap; int i; Node child; ElementState state; boolean preserveSpace; String name; String value; String tagName; tagName = elem.getTagName(); state = getElementState(); if ( isDocumentState() ) { // If this is the root element handle it differently. // If the first root element in the document, serialize // the document's DOCTYPE. Space preserving defaults // to that of the output format. if ( ! _started ) startDocument( tagName ); } else { // For any other element, if first in parent, then // close parent's opening tag and use the parnet's // space preserving. if ( state.empty ) _printer.printText( '>' ); // Must leave CData section first if ( state.inCData ) { _printer.printText( "]]>" ); state.inCData = false; } // Indent this element on a new line if the first // content of the parent element or immediately // following an element. if ( _indenting && ! state.preserveSpace && ( state.empty || state.afterElement || state.afterComment) ) _printer.breakLine(); } preserveSpace = state.preserveSpace; // Do not change the current element state yet. // This only happens in endElement(). _printer.printText( '<' ); _printer.printText( tagName ); _printer.indent(); // Lookup the element's attribute, but only print specified // attributes. (Unspecified attributes are derived from the DTD. // For each attribute print it's name and value as one part, // separated with a space so the element can be broken on // multiple lines. attrMap = elem.getAttributes(); if ( attrMap != null ) { for ( i = 0 ; i < attrMap.getLength() ; ++i ) { attr = (Attr) attrMap.item( i ); name = attr.getName(); value = attr.getValue(); if ( value == null ) value = ""; if ( attr.getSpecified() ) { _printer.printSpace(); _printer.printText( name ); _printer.printText( "=\"" ); printEscaped( value ); _printer.printText( '"' ); } // If the attribute xml:space exists, determine whether // to preserve spaces in this and child nodes based on // its value. if ( name.equals( "xml:space" ) ) { if ( value.equals( "preserve" ) ) preserveSpace = true; else preserveSpace = _format.getPreserveSpace(); } } } // If element has children, then serialize them, otherwise // serialize en empty tag. if ( elem.hasChildNodes() ) { // Enter an element state, and serialize the children // one by one. Finally, end the element. state = enterElementState( null, null, tagName, preserveSpace ); state.doCData = _format.isCDataElement( tagName ); state.unescaped = _format.isNonEscapingElement( tagName ); child = elem.getFirstChild(); while ( child != null ) { serializeNode( child ); child = child.getNextSibling(); } endElementIO( null, null, tagName ); } else { _printer.unindent(); _printer.printText( "/>" ); // After element but parent element is no longer empty. state.afterElement = true; state.afterComment = false; state.empty = false; if ( isDocumentState() ) _printer.flush(); } } protected String getEntityRef( int ch ) { // Encode special XML characters into the equivalent character references. // These five are defined by default for all XML documents. switch ( ch ) { case '<': return "lt"; case '>': return "gt"; case '"': return "quot"; case '\'': return "apos"; case '&': return "amp"; } return null; } /** Retrieve and remove the namespaces declarations from the list of attributes. * */ private Attributes extractNamespaces( Attributes attrs ) throws SAXException { AttributesImpl attrsOnly; String rawName; int i; int indexColon; String prefix; int length; length = attrs.getLength(); attrsOnly = new AttributesImpl( attrs ); for ( i = length - 1 ; i >= 0 ; --i ) { rawName = attrsOnly.getQName( i ); //We have to exclude the namespaces declarations from the attributes //Append only when the feature http://xml.org/sax/features/namespace-prefixes" //is TRUE if ( rawName.startsWith( "xmlns" ) ) { indexColon = rawName.indexOf( ':' ); //is there a prefix if ( indexColon != -1 && ( indexColon + 1 ) < rawName.length() ) prefix = rawName.substring( indexColon + 1 ); else prefix = ""; startPrefixMapping( prefix, attrs.getValue( i ) ); //Remove it attrsOnly.removeAttribute( i ); } } return attrsOnly; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -