package xmlmerge;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XMLTransformer {
private DocumentBuilder dom_builder;
public XMLTransformer() throws ParserConfigurationException {
DocumentBuilderFactory dom_builder_factory = DocumentBuilderFactory.newInstance();
dom_builder = dom_builder_factory.newDocumentBuilder();
}
private Element getNormalizedDocumentRoot( String filename ) {
Document document;
try {
document = dom_builder.parse( filename );
}
catch ( SAXException e ) {
System.out.printf( "Error: Error encountered during parsing: %s\n", e.getMessage() );
return dom_builder.newDocument().getDocumentElement();
}
catch ( IOException e ) {
System.out.printf( "Error: an error occoured during the parsing of %s: %s\n", filename, e.getMessage() );
return dom_builder.newDocument().getDocumentElement();
}
document.normalizeDocument();
return document.getDocumentElement();
}
public void mergeXMLs( String input_file_name_1, String input_file_name_2, String output_file_name ) {
//merge the 2 documents together inplace
Element root_out = getNormalizedDocumentRoot( input_file_name_1 );
Element root_2 = getNormalizedDocumentRoot( input_file_name_2 );
NodeList nodes_out = root_out.getChildNodes();
final int original_out_node_count = nodes_out.getLength();
while ( root_2.hasChildNodes() ) {
Node child = root_2.removeChild( root_2.getFirstChild() );
boolean equal_node = false;
for ( int i=0; i<original_out_node_count; i++ ) {
if ( nodes_out.item( i ).isEqualNode( child ) ) {
equal_node = true;
break;
}
}
// don't add duplicates
if ( equal_node ) continue;
root_out.appendChild( root_out.getOwnerDocument().importNode( child, true ) );
}
// write DOM into XML
try {
Source source = new DOMSource( root_out );
Transformer tr = TransformerFactory.newInstance().newTransformer();
tr.transform( source, new StreamResult( new File( output_file_name ) ) );
}
catch ( TransformerFactoryConfigurationError | TransformerException e ) {
System.out.printf( "Error: Error encountered when saving XML %s: %s\n", output_file_name, e.getMessage() );
}
}
}