Dúvida com XML [RESOLVIDO]

Bom Dia.

Alguém sabe como faço para definir o prefixo de todo um arquivo xml. Eu uso JAXB.

Tentei implementar uma classe que extende de NamespacePrefixMapper mas não obtive sucesso. O que eu consegui é definir a primeira tag do jeito que eu quero fazendo assim:

getMarshaller().marshal(new JAXBElement(new QName("mensagemTISS", "mensagemTISS", "ans"), MensagemTISS.class, msg), saida); 

Desta maneira, a primeira tag fica com o prefixo , que é o que eu desejo para todo meu arquivo.
Mas meu xml tem centenas de tags, penso que deve haver um parametro ou algo que faço com que todo o arquivo xml fique com as tags desejadas.

Agradeço.

A propriedade que você está usando para colocar os prefixos é essa?

http://java.sun.com/webservices/docs/1.6/jaxb/vendorProperties.html

Ela não funciona em todas as implementações do JAXB, então provavelmente se você usar
uma implementação que implementa essa propriedade vai funcionar.

E uma dica: a ANS não obriga que o prefixo do seu xml seja ans :wink:
e os prefixos dos namespaces não influenciam em nada o processo de marshall e unmarshall

Se mesmo assim vc quiser colocar prefixos, você pode fazer o marshal pra um Result do SAX
ou um Node do DOM, e depois usar Transformations pra transformar isso em arquivos.

[quote]A propriedade que você está usando para colocar os prefixos é essa?

http://java.sun.com/webservices/docs/1.6/jaxb/vendorProperties.html[/quote]
Sim, é essa sim.

[quote]Ela não funciona em todas as implementações do JAXB, então provavelmente se você usar
uma implementação que implementa essa propriedade vai funcionar. [/quote]
Como eu sei se com a minha implementação do JAXB ela deve funcionar??

Capaz… sério mesmo? To sofrendo com isso aqui…

Se eu colocar o código do meu namespacePrefixMapper aqui você me ajuda a conferir se ele está ok? Pois não sei como descubro se o erro é no meu código ou se é a implementação do meu JAXB que não suporta.

Agradeço.
Fernando.

certeza que a ans não obriga que o prefixo seja ans… eu to desenvolvendo os web-services do TISS :stuck_out_tongue:

Bah… então vou deixar isso de lado. Não vou mais me stressar com os prefixos.

É que quando vou validar ele no Visualizador de arquivos do Tiss dá a seguinte mensagem:
“O arquivo selecionado não corresponde aos padrões disponíveis no Visualizador”
Pensei que era por causa do prefixo que não tinha definido.

Deve ser outra coisa então.

Aproveitando o tópico então e já que você está na mesma tarefa, você já fez o cálculo da hash?

Agradeço.

tenta validar a mensagem que você tá mandando com o xsd do tiss
http://www.ans.gov.br/padroes/tiss/schemas/tissV2_01_03.xsd

Existe uma implementação de referência chamada TissNet… dá uma olhada nela… mas de qualquer
forma é só pegar todo o texto que está dentro das tags, concatenar um na frente do outro e passar
o hash MD5 neles.

De qualquer forma, esse código troca os prefixos dos elementos pra “ans”:

		Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
		MensagemTISS tiss = new MensagemTISS();
		//popula a mensagem
		Marshaller marshaller = JAXBContext.newInstance(MensagemTISS.class).createMarshaller();
		marshaller.marshal(tiss, document);
		NodeList elements = document.getElementsByTagName("*");
		for (int i = 0; i < elements.getLength(); i++) {
			elements.item(i).setPrefix("ans");
		}
		Transformer transformer = TransformerFactory.newInstance().newTransformer();
		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
		transformer.transform(new DOMSource(document), new StreamResult(System.out));

É só trocar o System.out pra qualquer InputStream ou Writer… O problema é que esse código pode ser meio lento…
Se você preferir voce pode colocar um xslt que faz isso… com certeza vai ficar mais rápido…

[]'s

O código tá me gerando a seguinte exception:

gnu.xml.dom.DomEx: The operation violates XML Namespaces. More Information: setting xmlns attribute to illegal value Node Name: mensagemTISS at gnu.xml.dom.DomElement.setAttributeNS(DomElement.java:249) at com.sun.xml.bind.marshaller.SAX2DOMEx.startElement(SAX2DOMEx.java:163) at com.sun.xml.bind.v2.runtime.output.SAXOutput.endStartTag(SAXOutput.java:124) at com.sun.xml.bind.v2.runtime.XMLSerializer.endAttributes(XMLSerializer.java:302) at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:588) at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:312) at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:490) at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:328) at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:257) at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:110) at com.faturamento.tiss.JTiss.montarXMLRun(JTiss.java:147) at com.faturamento.tiss.JTiss$2.run(JTiss.java:91) at java.lang.Thread.run(Thread.java:619)

Sabe me ajudar?

instala a VM da sun… você está com a VM da GNU instalada… ela provavelmente não tem algumas
features instaladas… por isso que vc não estava conseguindo setar o prefixo daquele primeiro jeito…

[quote=lucascs]instala a VM da sun… você está com a VM da GNU instalada… ela provavelmente não tem algumas
features instaladas… por isso que vc não estava conseguindo setar o prefixo daquele primeiro jeito…[/quote]
O que você fala por VM da Sun?? Virtual Machine? :shock:

Mas aí eu começo a pensar nas consequências daí… terei que trocar a versão do VM no cliente também?

Tu tem o link correto pra me dar então, porque não entendo como poderia ter instalado a VM da GNU e não da Sun…

Agradeço.
Fernando.

a vm da sun vc consegue baixar no site da sun…
é soh procurar por java runtime environment

se vc usa linux, e instalou o java usando algum gerenciador de pacotes é possivel
que a VM tenha vindo a da gnu…
se vc usa windows é realmente estranho vc ter a vm da gnu… mas de qqer forma
tenta baixar a vm do site da sun…

por padrão todas as pessoas instalam a vm da sun… (qdo vc entra em site de banco,
por exemplo, é essa vm que é baixada)…

Pois é, aqui é Windows… por isso estranhei.

Bem, vou atualizar aqui, mas não to muito crente na solução não.

Agradeço.

Infelizmente não deu certo. Tentei instalar outra jre mas não funcionou.

Mas uma dúvida eu tirei. Meu arquivo não estava sendo validado pelo programa Validador do Tiss. Então eu peguei manualmente mesmo e adicionei o prefixo ans: em todas as tags, e troquei também manualmente o cabeçalho para

 <?xml version="1.0" encoding="iso-8859-1" ?> 

porque pelo meu código, apesar de estar setando a propriedade

marshaller.setProperty(Marshaller.JAXB_ENCODING, "iso-8859-1");

no xml gerado ele não pego essa linha, pega utf.

Depois disso, meu xml passou a ser validado. Então não sei quanto àquela sua afirmação de que o prefixo ans: era dispensável, mas para mim, a inclusão do prefixo, mais a troca do cabeçalho fez meu arquivo se tornar correto.

Meu código deve estar com defeito em algum lugar para não estar trabalhando direito.

Mas bem, tentarei mais um pouco e farei mais algumas buscas na internet. Mas se você tiver mais alguma dica eu agradeço lucascs.

Atenciosamente.
Fernando.

vc tentou colocar só o cabeçalho do xml?

Olha cara… as vezes dá vontade de se dar um tiro da testa :smiley: :smiley:

Que barbaridade… desde ontem de tarde mexendo (desde manhã já pra falar a verdade) com estes prefixos do xml. Fui rever as fontes na internet que tinha usado como pesquisa, pois não podia aceitar que não estava dando certo. :roll:

Sabe por que não funcionava???
O nome da classe devia ser NamespacePrefixMapperImpl
e eu estava usando o s de space maiusculo NameSpacePrefixMapperImpl.

Foi só alterar isso e bah, blz… funcionou direitinho.

Valeu pela ajuda lucascs.
Agradeço muito. :thumbup:

Trazendo o tópico de volta…

lucascs, você pode me dar alguma sugestão sobre o cálculo do hash? Concatenei todo o conteúdo do meu xml, e efetuei o cálculo sobre ele, mas ao validá-lo, sempre me retorna “hash incorreto” no tissnet.

Na string concatenada, eu faço o seguinte:

  • Removo todos espaços em branco.
  • Tiro qualquer tipo de acentuação.
  • Pego somente o valor das tags.
  • Deixo, evidentemente, as tags do epilogo de fora do cálculo.

No fim das contas tenho uma string assim:
ENVIO_LOTE_GUIAS129/05/200715:13999999999998888882.01.013173088888802/01/2007103500111254874126577777777777777777777Paciente TestenomeConvenio99999999999Joao da Silva081Rua das Flores550411520PR871000001111111CRM5.555PR06117CID-10I10._02/01/2007940001001415observacao
que gera o código:
d41d8cd98f00b204e9800998ecf8427e

Só que o tissnet rejeita.
Tu teria alguma dica a mais, que eu deveria fazer na hora de gerar a string?? Quem sabe remover a identação do xml? Isso eu ainda não faço.
Incrivelmente a ans não dá suporte, então temos que buscar referências em outros lugares.

Te agradeço pela ajuda.

Valeu pela ajuda. Consegui resolver meus problemas.

XML’s gerados e validados com sucesso.

Agradeço.

lucascs, boa noite

Tentei executar o código que vc disponibilizou para acrescentar o prefixo “ans” ao meu xml,

[code]
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
mensagem = new MensagemTiss();

Marshaller ms = JAXBContext.newInstance(MensagemTISS.class).createMarshaller();
ms.marshal(mensagem, doc);[/code]

mas retornou o seguinte erro:

javax.xml.bind.JAXBException: class br.gov.ans.tiss.nucleo.MensagemTiss nor any of its super class is known to this context.

Pode me ajudar com esse erro?

opa, descobri meu erro, valeu