Galera, estou com o seguinte problema estamos usando o Xfire para ler um determinado webservice e gravar um xml para que o Ireport popule um relatório, mas estou tendo um pequeno problema:
Quando gravo o resultado em xml com o método:
DOMUtils.writeXml((Document) resultado[0], new FileOutputStream(new File("c:/teste.xml")));
Ele me gera um arquvo mais ou menos assim:
<?xml version="1.0" encoding="UTF-8"?>
<out xmlns="http://localhost:8080/MJXFire">
<ns1:Book xmlns:ns1="http://ws.empresa.com.br">
<author xmlns="http://ws.empresa.com.br">Teste Autor</author>
<isdn xmlns="http://ws.empresa.com.br">123456789</isdn>
<title xmlns="http://ws.empresa.com.br">Teste Titulo</title>
</ns1:Book>
Mas na hora que populamos esse relatório atraves desse xml na tag <ns1:Book de alguma forma ele se perde, o erro foi localizado, se eu retiro esses : da tag o IReport consegue ler tranquilamente, fiz um outro teste com Dom ele le sem problema algum esse tipo de xml.
Erro gerado pelo IReport:
Exception in thread "main" net.sf.jasperreports.engine.JRException: XPath selection failed. Expression: /out/ns1:Book
at net.sf.jasperreports.engine.data.JRXmlDataSource.moveFirst(JRXmlDataSource.java:278)
at net.sf.jasperreports.engine.data.JRXmlDataSource.<init>(JRXmlDataSource.java:188)
at br.com.empresa.RelatorioXML.main(RelatorioXML.java:29)
Caused by: javax.xml.transform.TransformerException: O prefixo deve ser resolvido para um namespace: ns1
at org.apache.xpath.compiler.XPathParser.error(XPathParser.java:602)
at org.apache.xpath.compiler.Lexer.mapNSTokens(Lexer.java:638)
at org.apache.xpath.compiler.Lexer.tokenize(Lexer.java:356)
at org.apache.xpath.compiler.Lexer.tokenize(Lexer.java:96)
at org.apache.xpath.compiler.XPathParser.initXPath(XPathParser.java:108)
at org.apache.xpath.XPath.<init>(XPath.java:162)
at org.apache.xpath.CachedXPathAPI.eval(CachedXPathAPI.java:276)
at org.apache.xpath.CachedXPathAPI.selectNodeList(CachedXPathAPI.java:209)
at org.apache.xpath.CachedXPathAPI.selectNodeList(CachedXPathAPI.java:189)
at net.sf.jasperreports.engine.data.JRXmlDataSource.moveFirst(JRXmlDataSource.java:274)
... 2 more
Qual seria a solução mais elegante para esse tipo de situação?, abrir esse xml e dar um replace nos : antes de disponibilizar para o Jasper?