Se você precisou atribuir um namespace a um xml sendo que o marshall precisa ser feito sem declaração de "xmlns:ns2" não tem santo que faça o JAXB remover isso, andei pesquisando bastante e devido à pressa para solucionar o problema achei 2 soluções que não são as melhores, porém resolvem o problema.
1: Remover o nodo do XML ns2 no parse:
# NodeList elements = doc.getElementsByTagName("infNFe");
# Element el = (Element) elements.item(i);
# String id = el.getAttribute("Id");
# // aqui ocorre a remoção do atributo...
# doc.getDocumentElement().removeAttribute("xmlns:ns2");
# ((Element)
# doc.getDocumentElement().getElementsByTagName("NFe").item(0))
# .setAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");
#
# Create a DOM XMLSignatureFactory that will be used to
# generate the enveloped signature.
#
# Reference ref = fac.newReference("#" + id, fac.newDigestMethod(
# DigestMethod.SHA1, null), transformList, null, null);
Um exemplo completo do código em:
http://www.guj.com.br/posts/list/83758.java
Aqui uma gambiarra que foi usada até que se resolvesse da maneira acima:
// passa-se o file a ser re-formatado como string
public void ajustaXml(File file) throws Exception {
FileReader reader = new FileReader(file);
BufferedReader leitor = new BufferedReader(reader);
leitor.read();
String vlr = "";
StringBuffer vlrFile = new StringBuffer();
String line = leitor.readLine();
while(line != null) {
vlrFile.append( line );
line = leitor.readLine();
}
vlr = vlrFile.toString();
if (vlr.indexOf("ns2:") > -1) {
vlr = vlr.replaceAll("ns2:", "");
}
if (vlr.indexOf(":ns2") > -1) {
vlr = vlr.replaceAll(":ns2", "");
}
leitor.close();
reader.close();
FileWriter writer = new FileWriter(file);
PrintWriter saida = new PrintWriter(writer);
saida.print( "<" + vlr);
writer.close();
saida.close();
}
Ambas maneiras acima resolvem o problema do ns2, e servem para remover o ns2 do jaxb, se alguem tiver uma solução melhor favor comentar.
Assim que eu resolver de forma correta esse problema postarei aqui a resposta.
Abraço
Conforme prometido.. segue solução abaixo:
SOLUÇÃO CORRETA, SEM GAMBIARRAS (Setando um name space preferido) :
SIm, há solução de personalizar os namespaces, no link:
http://blogs.sun.com/enterprisetechtips/entry/customizing_jaxb
Você encontra a solução.
Você precisa criar uma classe que estenda NamespacePrefixMapper vide:
[code]NamespacePrefixMapper m = new PreferredMapper();
marshal(jc, e, m);
public static class PreferredMapper extends NamespacePrefixMapper {
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
return "mappedNamespace" + namespaceUri;
}
}[/code]
Depois no seu marshaller voce seta:
[code]final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper",
new NamespacePrefixMapperImpl("http://www.isotc211.org/2005/gmd"));[/code]
Abraço
Nenhum comentário:
Postar um comentário