1 57 58 package dom; 59 60 import java.io.IOException ; 61 import java.io.OutputStreamWriter ; 62 import java.io.PrintWriter ; 63 64 import org.enhydra.apache.xerces.dom.NodeImpl; 65 import org.enhydra.apache.xerces.framework.XMLAttrList; 66 import org.enhydra.apache.xerces.parsers.DOMParser; 67 import org.enhydra.apache.xerces.utils.QName; 68 import org.w3c.dom.Attr ; 69 import org.w3c.dom.Document ; 70 import org.w3c.dom.NamedNodeMap ; 71 import org.w3c.dom.Node ; 72 import org.w3c.dom.NodeList ; 73 74 84 85 public class DOMAddLines extends DOMParser { 86 87 88 private PrintWriter out; 89 static private boolean NotIncludeIgnorableWhiteSpaces = false; 90 91 92 public DOMAddLines( String inputName ) { 93 95 try { 96 this.setFeature( "http://apache.org/xml/features/dom/defer-node-expansion", false ); 97 this.parse( inputName ); 98 out = new PrintWriter (new OutputStreamWriter (System.out, "UTF8")); 99 } catch ( IOException e ) { 100 System.err.println( "except" + e ); 101 } catch ( org.xml.sax.SAXException e ) { 102 System.err.println( "except" + e ); 103 } 104 } 106 107 public void print(Node node) { 108 if ( node == null ) { 110 return; 111 } 112 113 String lineRowColumn = (String ) ((NodeImpl) node).getUserData(); 114 115 int type = node.getNodeType(); 116 switch ( type ) { 117 case Node.DOCUMENT_NODE: { 119 out.println( lineRowColumn + ":" + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 120 print( ((Document )node).getDocumentElement()); 121 out.flush(); 122 break; 123 } 124 125 case Node.ELEMENT_NODE: { 127 out.print( lineRowColumn + ":" + '<'); 128 out.print(node.getNodeName()); 129 Attr attrs[] = sortAttributes(node.getAttributes()); 130 for ( int i = 0; i < attrs.length; i++ ) { 131 Attr attr = attrs[i]; 132 out.print(' '); 133 out.print(attr.getNodeName()); 134 out.print("=\""); 135 out.print( attr.getNodeValue()); 136 out.print('"'); 137 } 138 out.print('>'); 139 NodeList children = node.getChildNodes(); 140 if ( children != null ) { 141 int len = children.getLength(); 142 for ( int i = 0; i < len; i++ ) { 143 print(children.item(i)); 144 } 145 } 146 break; 147 } 148 149 case Node.ENTITY_REFERENCE_NODE: { 151 out.print('&'); 152 out.print(node.getNodeName()); 153 out.print(';'); 154 break; 155 } 156 157 case Node.CDATA_SECTION_NODE: { 159 out.print("<![CDATA["); 160 out.print(node.getNodeValue()); 161 out.print("]]>"); 162 break; 163 } 164 165 case Node.TEXT_NODE: { 167 out.print( node.getNodeValue()); 168 break; 169 } 170 171 case Node.PROCESSING_INSTRUCTION_NODE: { 173 out.print("<?"); 174 out.print(node.getNodeName()); 175 String data = node.getNodeValue(); 176 if ( data != null && data.length() > 0 ) { 177 out.print(' '); 178 out.print(data); 179 } 180 out.print("?>"); 181 break; 182 } 183 } 184 185 if ( type == Node.ELEMENT_NODE ) { 186 out.print("</"); 187 out.print(node.getNodeName()); 188 out.print('>'); 189 } 190 191 out.flush(); 192 193 } 195 196 197 private Attr [] sortAttributes(NamedNodeMap attrs) { 198 199 int len = (attrs != null) ? attrs.getLength() : 0; 200 Attr array[] = new Attr [len]; 201 for ( int i = 0; i < len; i++ ) { 202 array[i] = (Attr )attrs.item(i); 203 } 204 for ( int i = 0; i < len - 1; i++ ) { 205 String name = array[i].getNodeName(); 206 int index = i; 207 for ( int j = i + 1; j < len; j++ ) { 208 String curName = array[j].getNodeName(); 209 if ( curName.compareTo(name) < 0 ) { 210 name = curName; 211 index = j; 212 } 213 } 214 if ( index != i ) { 215 Attr temp = array[i]; 216 array[i] = array[index]; 217 array[index] = temp; 218 } 219 } 220 221 return (array); 222 223 } 225 226 227 228 229 public void startElement(QName elementQName, XMLAttrList attrList, int attrListIndex) throws Exception 230 { 231 super.startElement(elementQName, attrList, attrListIndex); 232 233 NodeImpl node = null; 234 try { 235 node = (NodeImpl) this.getProperty( "http://apache.org/xml/properties/dom/current-element-node" ); 236 } 238 catch( org.xml.sax.SAXException ex ) 239 { 240 System.err.println( "except" + ex );; 241 } 242 if( node != null ) 244 node.setUserData( String.valueOf( getLocator().getLineNumber() ) ); } 247 248 249 public void startDocument(int versionIndex, int encodingIndex, 250 int standAloneIndex) 251 { 252 super.startDocument(); 255 NodeImpl node = null ; 256 try { 257 node = (NodeImpl) this.getProperty( "http://apache.org/xml/properties/dom/current-element-node" ); 258 } 260 catch( org.xml.sax.SAXException ex ) 261 { 262 System.err.println( "except" + ex );; 263 } 264 265 if( node != null ) 267 node.setUserData( String.valueOf( getLocator().getLineNumber() ) ); } 270 271 public void ignorableWhitespace(int dataIndex) throws Exception 272 { 273 if(! NotIncludeIgnorableWhiteSpaces ) 274 super.ignorableWhitespace( dataIndex); 275 else 276 ; } 279 280 281 285 286 public static void main(String argv[]) { 287 if ( argv.length == 0 ) { 289 printUsage(); 290 System.exit(1); 291 } 292 294 for ( int i = 0; i < argv.length; i++ ) { 295 String arg = argv[i]; 296 297 if ( arg.startsWith("-") ) { 299 if ( arg.equals("-h") ) { 300 printUsage(); 301 System.exit(1); 302 } 303 if (arg.equals("-i")) { 304 NotIncludeIgnorableWhiteSpaces = true; 305 continue; 306 } 307 308 } 309 311 DOMAddLines domAddExample = new DOMAddLines( arg ); 312 Document doc = domAddExample.getDocument(); 313 domAddExample.print( doc ); 314 315 } 316 } 318 319 private static void printUsage() { 320 System.err.println("usage: jre dom.DOMAddLines uri ..."); 321 System.err.println(); 322 System.err.println(" -h This help screen."); 323 System.err.println(" -i don't print ignorable white spaces"); 324 325 } 327 } 328 | Popular Tags |