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