JAXB E O MALDITO NS2

08/04/2010        





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

Topo     Link para este post     Comentários

Redação Ige. ( redacao@informativogeral.com.br )





 
Lomadee, uma nova espécie na web. A maior plataforma de afiliados da América Latina




VOTE NO AMARELINHO PARA O TOP BLOG 2010
     


próximas >>