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:
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.
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
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]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.
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?
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…
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)
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…
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)…
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
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.
Olha cara… as vezes dá vontade de se dar um tiro da testa
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:
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.