Remover prefix namespace JAX-WS

tenta usar a ferramenta wsimport pra gerar as classes de modelo a partir do wsdl

assim vc não precisa ficar manipulando a árvore DOM, que é bastante feio é suscetivel a erros…

https://jax-ws.dev.java.net/jax-ws-ea3/docs/wsimport.html

se mesmo assim vc precisar trabalhar com árvores DOM dê uma olhada no JAXB
(JAXBFactory, Marshaller, Unmarshaller, ambos trabalham com DOM)

[]'s

E o pior de tudo é que eu usei o wsdlimport e estou trabalhando com objetos !

O problema é que tenho uma lista e tenho que passar um xml no seu conteudo.

Quando passo uma String os caracteres ficam desconfigurados.

Tipo:


<ns1:consReciCTe ns1:versao="1.00" xmlns:ns1="http://www.portalfiscal.inf.br/cte">
    <ns1:tpAmb>2</ns1:tpAmb>
    <ns1:nRec>03000000000887</ns1:nRec>
</ns1:consReciCTe>

E ai tenho que passar um Document… por isso que da esse erro e eu não consigo mudar o prefix do namespace.

Se eu passar uma string ele vai do jeito que eu quero

Sera que tem como eu passar essa String sem ter esses caracteres malucos?

os caracteres não apareceram eles são o "e comercial " seguidos de lt ou gt

sim… se vc passar um xml por string, ele vai escapar os caracteres reservados para o xml
como o < = < e o > = >

Tem como eu passar string sem escapar esses caracteres?

só se a string estiver dentro de um CDATA…
caso contrario ela seria interpretada como um pedaço de xml…

tentei colocar num e ainda mostra caracteres especiais. :frowning:

estou quase desistindo disso rsrs

colocar num CDATA não é colocar:

String xml = "<blah></blah>";
xml = "<!CDATA[" + xml + "]>";

é fazer algo como:

Document d;
d.createCDATA(xml);

não lembro como usa, mas é algo do tipo…

[]'s

Pessoal,

tendo o arquivo XML gerado, como passo para o objeto cteDadosMsg? É diferente da NFe, que normalmente tratava tudo como String.

Dá pra fazer isso?

Obrigado

Ninguém?

Para fazer isso você pode usar o JAXB https://jaxb.dev.java.net

Na verdade estou utilizando o NetBeans para criação de uma classe de comunicação, assim como foi feito para a NF-e. O problema é que como o CT-e não segue o padrão da NF-e, onde o método era chamado com 2 parâmetros String (cabeçalho e dados), ainda não consegui passar as informações para o objeto cteDadosMsg.

Eu já possuo o XML gerados, tudo que eu preciso é passar para a classe cteDadosMsg.

Poderia dar uma dica? No projeto de NF-e, eu jogava os dados do XML para Strings e estava ok.

Obrigado

Você já importou o WS com o wsimport para gerar as classes?

Não, eu gerei as classes diretamente no NetBeans utilizando o WSDL. O que ele gera é:

try { // Call Web Service Operation
br.inf.portalfiscal.cte.wsdl.ctestatusservico.CteStatusServico service = new br.inf.portalfiscal.cte.wsdl.ctestatusservico.CteStatusServico();
br.inf.portalfiscal.cte.wsdl.ctestatusservico.CteStatusServicoSoap12 port = service.getCteStatusServicoSoap12();
// TODO initialize WS operation arguments here
br.inf.portalfiscal.cte.wsdl.ctestatusservico.CteDadosMsg cteDadosMsg = new br.inf.portalfiscal.cte.wsdl.ctestatusservico.CteDadosMsg();
// TODO process result here
br.inf.portalfiscal.cte.wsdl.ctestatusservico.CteStatusServicoCTResult result = port.cteStatusServicoCT(cteDadosMsg);
System.out.println("Result = "+result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}

Muito similar ao que gerava para NF-e. O que eu não estou sabendo fazer é passar os dados dos XML, que já tenho em variáveis String para o objeto cteDadosMsg.

Obrigado novamente!

Então, você já tem o objeto cteDadosMsg o que voce precisa fazer é fazer o binding usando o JAXB.

O JAXB possui duas classes que ajudam fazer isso uma delas é o Marshaller que transforma o objeto java em XML.

Outra é o UnMarshaller que transforma o XML em Objeto.

Exemplo:


String xml = "...."

JAXBContext jaxbContext=JAXBContext.newInstance(CteDadosMsg.class);

Unmarshaller unMarshaller = jaxbContext.createUnmarshaller();
JAXBElement<CteDadosMsg> element = (JAXBElement<CteDadosMsg>) 
unMarshaller.unmarshal(new StreamSource(new ByteArrayInputStream(xml.getBytes())),CteDadosMsg.class);

CteDadosMsg cteDadosMsg = element.getValue();

Esse link pode te ajudar melhor:
http://onjava.com/pub/a/onjava/2004/12/15/jaxb.html

cristiano.andrade vc conseguiu resolver esse problema do namespace?

Estou exatamente com o mesmo problema na NF-e.
Qdo adiciono um Document xml no meu objeto NfeDadosMsg na tag infCanc, ele adiciona o namespace e um xmlns="" (vazio)

Olha só o xml gerado:

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Header>
        <ns2:nfeCabecMsg xmlns:ns2="http://www.portalfiscal.inf.br/nfe/wsdl/NfeCancelamento2" xmlns="http://www.portalfiscal.inf.br/nfe">
                <ns2:cUF>41</ns2:cUF>
                <ns2:versaoDados>2.00</ns2:versaoDados>
        </ns2:nfeCabecMsg>
</S:Header>
<S:Body>
<ns2:nfeDadosMsg xmlns:ns2="http://www.portalfiscal.inf.br/nfe/wsdl/NfeCancelamento2" xmlns="http://www.portalfiscal.inf.br/nfe">
<cancNFe versao="2.00">
  <infCanc xmlns="" xmlns:ns3="http://www.portalfiscal.inf.br/nfe" Id="ID41101206065256000163550010000005040001194848">
    <ns3:tpAmb>2</ns3:tpAmb>
    <ns3:xServ>CANCELAR</ns3:xServ>
    <ns3:chNFe>41101206065256000163550010000005040001194848</ns3:chNFe>
    <ns3:nProt>21123123123</ns3:nProt>
    <ns3:xJust>alguma justificativa generica</ns3:xJust>
  </infCanc>
</cancNFe>
</ns2:nfeDadosMsg>
</S:Body>
</S:Envelope>

O estranho é que só aparece esse xmlns="" qdo o xml tem algum atributo, como por exemplo o Id=“ID41101206065256000163550010000005040001194848”

Se puder me dar uma luz ficaria muito agradecido.

Amigo… alguem conseguiu retirar esses prefixos <ns2: do XML ?

Então. Não consegui remover. :stuck_out_tongue:

Tive que criar um envelope soup na mão.

para remover esses prefixos indesejáveis precisa implementar esta interface: NamespacePrefixMapper

segue: https://blogs.oracle.com/enterprisetechtips/entry/customizing_jaxb

Diferente dessas pessoas que somente diz que resolveu e não posta a solução, vou postar aqui como consegui resolver, de todas foi a mais fáil que achei :

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.meunamespace.inf.br",
		xmlns =
		  {
		    @javax.xml.bind.annotation.XmlNs(prefix = "",
		      namespaceURI="http://www.meunamespace.inf.br")
		  },
		elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)	
package br.inf.portalfiscal.nfe;

Criei o arquivo package-info.java, coloquei dentro da pasta onde gera o XML e funfou perfeitamente.