Comparação de XML

Seguite galera, tenho 2 arquivos xml de mesma estrutura e preciso comparar se os valores e atritutos de cada nó estão iguais.
Sugestões?
Usei o código abaixo:

             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	    dbf.setNamespaceAware(true);
	    dbf.setCoalescing(true);
	    dbf.setIgnoringElementContentWhitespace(true);
	    dbf.setIgnoringComments(true);
	    DocumentBuilder db = null;

	    try {
			db = dbf.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}

	    Document doc1 = null;
		try {
			doc1 = db.parse(new File("C:\\PH\\logconfig.xml"));
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	    doc1.normalizeDocument();

	    Document doc2 = null;
		try {
			doc2 = db.parse(new File("C:\\PH\\logconfigVal.xml"));
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	    doc2.normalizeDocument();

	    System.out.println("--------------------------.");
	    Assert.assertTrue(doc1.isEqualNode(doc2));
	    System.out.println("--------------------------");

Erro gerado:

Exception in thread "main" junit.framework.AssertionFailedError
	at junit.framework.Assert.fail(Assert.java:47)
	at junit.framework.Assert.assertTrue(Assert.java:20)
	at junit.framework.Assert.assertTrue(Assert.java:27)
	at br.com.wdev.maven.plugin.checklist.rules.LogConfigRule.listaDiferencas(LogConfigRule.java:216)
	at br.com.wdev.maven.plugin.checklist.rules.LogConfigRule.execute(LogConfigRule.java:115)
	at br.com.wdev.maven.plugin.checklist.rulesets.Teste.main(Teste.java:29)

Se existir alguma API melhor para realizar essa comparação, favorinformar.

no seu exemplo ai os dois documentos sao iguais?

Sim. Segue os arquivos.
Arquivo Template:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<define name="applicationName" class="br.com.bradseg.bsad.framework.core.logging.utils.ApplicationPropertyDefiner" /> 
	<define name="targetPath" class="br.com.bradseg.bsad.framework.core.logging.utils.LogTargetPathPropertyDefiner" /> 
	
	<jmxConfigurator />
	
	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${targetPath}/${applicationName}.log</file>
		<encoder>
			<pattern>%-40(%d{ISO8601} [%thread]) ${applicationName} %-5level %-60logger - %msg%n</pattern>
		</encoder>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<FileNamePattern>${targetPath}/${applicationName}-%d{yyyy-MM-dd}.%i.log.zip</FileNamePattern>
			<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<MaxFileSize>10MB</MaxFileSize>
			</TimeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>
	
	<logger name="org.mortbay" level="WARN" />
	<logger name="org.apache" level="INFO" />
	<logger name="com.opensymphony" level="INFO" />
	<logger name="org.springframework" level="INFO" />
	<logger name="br.com.bradseg.bsad.framework" level="INFO"/>
	<logger name="br" level="INFO" />

	<root level="INFO">
				 <appender-ref ref="FILE" />
	</root>
</configuration>

Exemplo de arquivo que será validado:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<define name="NOME DO DEFINE 1" class="CLASSE DO DEFINE 1" /> 
	<define name="NOME DO DEFINE 2" class="CLASSE DO DEFINE 2" /> 
	
	<jmxConfigurator />
	
	<appender name="NOME DO APENDER" class="CLASSE DO APENDER">
		<file>VALOR DO FILE</file>
		<encoder>
			<pattern>VALOE DO PATTERN</pattern>
		</encoder>
		<rollingPolicy class="CLASSE DO ROLLING POLICY">
			<FileNamePattern>VALOR DO FileNamePattern</FileNamePattern>
			<TimeBasedFileNamingAndTriggeringPolicy class=" CLASSE DO TimeBasedFileNamingAndTriggeringPolicy">
				<MaxFileSize>VALOR DO MaxFileSize</MaxFileSize>
			</TimeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>
	
	<logger name="NOME DO LOGGER 1" level="LEVEL DO LOGGER 1" />
	<logger name="NOME DO LOGGER 2" level="LEVEL DO LOGGER 2" />
	<logger name="NOME DO LOGGER 3" level="LEVEL DO LOGGER 3" />
	<logger name="NOME DO LOGGER 4" level="LEVEL DO LOGGER 4" />
	<logger name="NOME DO LOGGER 5" level="LEVEL DO LOGGER 5"/>
	<logger name="NOME DO LOGGER 6" level="LEVEL DO LOGGER 6" />

	<root level="LOGGER DO ROOT">
				 <appender-ref ref="RER DO ROOT" />
	</root>
</configuration>	

eu perguntei se eles sao iguais e vc falou que sim e posta dois arquivos diferentes…

o erro que mostrou é do junit pq vc chamou Assert.assertTrue que espera um true caso seja false ele vai lançar o erro que vc teve…

vc sabe oq q é junit?

Sei sim(JUnit).
Sobre os arquivos xml eu quis dizer que a estrutura de nos é igual.
Ja os atributos e valores podem vir diferentes.

Ex:
Nó “define” do arquivo template.

 <define name="applicationName" class="br.com.bradseg.bsad.framework.core.logging.utils.ApplicationPropertyDefiner" /> 

No “define” do arquivo que será validado.

<define name="NOME DO DEFINE 1" class="CLASSE DO DEFINE 1" />

O Nó é o mesmo. Os valores dos atributos “name” e “class” que estão diferentes.

Fiz um debug novamente do código.

Ao dar o “inspect” dos objetos doc1 e doc2 antes de executar a linha Assert.assertTrue(doc1.isEqualNode(doc2)); verifiquei que para ambos é apresentado o valor abaixo.

[#document: null]

isso vai retornar false…

se vc quer validar comprar a estrutura crie uma xsd e valide os dois xmls com a mesma xsd

usa o http://xmlunit.sourceforge.net e compara a estrutura!