package com.alethis.xml; import org.xml.sax.*; import org.xml.sax.helpers.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.stream.*; import javax.xml.transform.sax.*; import java.io.*; public class FilterWithCustomContentHandler { public static File INPUT_FILE = new File("c:\\project\\xml\\in.xml"); public static File OUTPUT_FILE = new File("c:\\project\\xml\\out.xml"); public final static void main(String[] args) { try { FileReader fr = new FileReader(INPUT_FILE); BufferedReader br = new BufferedReader(fr); InputSource is = new InputSource(br); XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); CustomFilter filter = new CustomFilter(); filter.setParent(parser); filter.setContentHandler(new ContentHandlerImpl()); SAXSource source = new SAXSource(filter, is); FileWriter fw = new FileWriter(OUTPUT_FILE); BufferedWriter bw = new BufferedWriter(fw); StreamResult result = new StreamResult(bw); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.transform(source, result); System.out.println("DONE"); } catch (TransformerConfigurationException e) { System.out.println("Transformer Configuration Exception: " + e.getMessage()); } catch (TransformerException e) { System.out.println("Transformer Exception: " + e.getMessage()); } catch (IOException e) { System.out.println("IO Exception: " + e.getMessage()); } catch (SAXException se) { System.out.println("SAX exception: " + se.getMessage()); } } } class CustomFilter extends XMLFilterImpl { public void setContentHandler(ContentHandler handler) { super.setContentHandler(new CustomContentHandler(handler)); } } class CustomContentHandler implements ContentHandler { private ContentHandler parent; private static int id = 0; public CustomContentHandler(ContentHandler parent) { this.parent = parent; } public void startElement(String namespaceURI, String localName, String qualifiedName, Attributes attrs) throws SAXException { AttributesImpl a = new AttributesImpl(attrs); a.addAttribute(null, "id", "id", "ID", "_" + String.valueOf(id++)); parent.startElement(namespaceURI, localName, qualifiedName, a); } public void endElement(String namespaceURI, String localName, String qualifiedName) throws SAXException { parent.endElement(namespaceURI, localName, qualifiedName); } public void startDocument() throws SAXException { parent.startDocument(); } public void endDocument() throws SAXException { parent.endDocument(); } public void startPrefixMapping(String prefix, String uri) throws SAXException { parent.startPrefixMapping(prefix, uri); } public void endPrefixMapping(String prefix) throws SAXException { parent.endPrefixMapping(prefix); } public void characters(char[] text, int start, int length) throws SAXException { parent.characters(text, start, length); } public void ignorableWhitespace(char[] text, int start, int length) throws SAXException { parent.ignorableWhitespace(text, start, length); } public void processingInstruction(String target, String data) throws SAXException { parent.processingInstruction(target, data); } public void skippedEntity(String name) throws SAXException { parent.skippedEntity(name); } public void setDocumentLocator(Locator locator) { parent.setDocumentLocator(locator); } }