JAXB E O MALDITO NS2

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: