Estou criando um xml, utilizando a libxml2 e ocorre o seguinte problema:
Quando existem caracteres especiais como: &,<,>,'," o xml não consegue "entender". Gostaria de saber como substituir esses, pelos seus códigos de forma que eu possa criar o xml sem problemas.
O xml é para a Nfe. No manual é citado esse problema e cita alguns exemplos de códigos como: & = & " = " etc. Mas esses códigos são para HTML.
Agradeço
Bruno Borges
------------------------------------
,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia: |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
| E se você é usuário do BOL lembre-se de cadastrar o |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´Links do Yahoo! Grupos
<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/python-brasil/
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@yahoogrupos.com.br
<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html
Já tentou usar CDATA[1] nos elementos com esses caracteres?
[1] - http://www.w3schools.com/xml/xml_cdata.asp
> Boa tarde,
>
> Estou criando um xml, utilizando a libxml2 e ocorre o seguinte
> problema:
>
> Quando existem caracteres especiais como: &,<,>,'," o xml não
> consegue "entender". Gostaria de saber como substituir esses, pelos
> seus códigos de forma que eu possa criar o xml sem problemas.
>
> O xml é para a Nfe. No manual é citado esse problema e cita alguns
> exemplos de códigos como: & = & " = " etc. Mas esses
> códigos são para HTML.
Sim e funcionam em xml até onde eu lembro (tento me manter longe de
xml o máximo possível). Tu já tentou usar eles e não funcionou ou tu
só supos que não iam funcionar e nem tentou? Não ficou claro no teu
email, mas provavelmente os entity codes são o suficiente. Só pra
lembrar tu não precisa fazer essa tradução manualmente, tem uma função
xml.encode em algum lugar da stdlib.
--
Leonardo Santagada
santagada at gmail.com
Eu já tentei, quando tento criar o xml com caracter especial, até cria mas da problema, por exemplo: Se eu colocar em uma tag o conteúdo: INDUSTRIA & COMERCIO, resulta em: <Nome>INDUSTRIA </Nome>.
Vou dar uma olhada no xml.encode, obrigado.
Bruno Borges
São os únicos caracteres não permitidos no XML, até onde sei.
O resto você pode usar UTF-8 sem problemas.
>>> from xml.sax.saxutils import escape
>>> escape('< & >')
'< & >'
http://wiki.python.org/moin/EscapingXml
Caio Ariede
http://caioariede.com/
2009/8/3 Leonardo Santagada <sant...@gmail.com>:
Para a codificação UTF-8, os códigos são outros.
Bruno Borges
>
> Bruno,
>
> Segundo o manual da NFe, é possível utilizar os simbolos, página 69, na
> versão 2.02a
>
> Transcrevendo o trecho:
>
> 5.3 Tratamento de caracteres especiais no texto de XML
> Todos os textos de um documento XML passam por uma análise do "parser"
> específico da
>
> Pág. 69 / 144
> linguagem. Alguns caracteres afetam o funcionamento deste "parser", não
> podendo
> aparecer no texto de uma forma não controlada.
> Os caracteres que afetam o "parser" são:
> • > (sinal de maior),
> • < (sinal de menor),
> • & (e-comercial),
> • " (aspas),
> • ` (sinal de apóstrofe).
> Alguns destes caracteres podem aparecer especialmente no campo de Razão
> Social,
> Endereço e Informação Adicional. Para resolver esses casos, é recomendável o
> uso de uma
> seqüência de "escape" em substituição ao caractere que causa o problema.
> Ex. a denominação: DIAS & DIAS LTDA deve ser informada como: DIAS & DIAS
> LTDA
> no XML para não afetar o funcionamento do "parser".
> caractere seqüência de escape
> < <
> > >
> & &
> " "
> ' '
>
> Abração
>
> 2009/8/3 Leonardo Santagada <santagada@...>
Estou dando uma olhada no site que vc passou, vou testar aqui.
Obrigado
Bruno Borges
>
> 2009/8/3 bruno.borges100 <bruno.python@...>:
> Leonardo,
>
> Eu já tentei, quando tento criar o xml com caracter especial, até
> cria mas da problema, por exemplo: Se eu colocar em uma tag o
> conteúdo: INDUSTRIA & COMERCIO, resulta em: <Nome>INDUSTRIA </Nome>.
Sim tinha que ser INDUSTRIA & COMERCIO, é assim que a tabela de
tradução funciona.
Os elementos citados tais como "&" fazem parte das entidades XML
válidas. Lembre-se que HTML é um sub-conjunto de XML. Então veja o
trecho de código seguinte:
>>> import cgi
>>> print cgi.escape("INDUSTRIA & COMERCIO")
INDUSTRIA & COMERCIO
Portanto, o seguinte fragmento deve funcionar em qualquer parser XML.
>>> xml = """<?xml version="1.0" encoding="UTF-8" ?>
<nome>INDUSTRIA & COMERCIO</nome>"""
>>> import amara
>>> doc = amara.parse(xml)
>>> print doc.nome
INDUSTRIA & COMERCIO
2009/8/4 Leonardo Santagada <sant...@gmail.com>:
>> ,----------------------------------------------------------.
>> | Antes de enviar um e-mail para o grupo leia: |
>> | http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
>> | E se você é usuário do BOL lembre-se de cadastrar o |
>> | e-mail do grupo na lista branca do seu sistema anti-spam. |
>> `----------------------------------------------------------´Links
>> do Yahoo! Grupos
>>
>>
>
> --
> Leonardo Santagada
> santagada at gmail.com
>
>
--
Daniel Gonçalves
Base4 Sistemas Ltda.
[www.base4.com.br]
[twitter.com/spanazzi]
Mas o problema ainda persiste, quando envio a NFe para a sefaz, está retornando Falha de schema. Pode ser algum problema no ambiente de homologação ou talvez outra coisa errada no xml, mas acho dificil, pq quando eu tiro o destinatario que é o único que está com caracter especial, o envio da certo. Vou tentar resolver aqui.
Agradeço a ajuda de todos
--- Em ter, 4/8/09, bruno.borges100 <bruno....@gmail.com> escreveu:
De: bruno.borges100 <bruno....@gmail.com>
Assunto: [python-brasil] Re: Caracteres especiais UTF8
Para: python...@yahoogrupos.com.br
Data: Terça-feira, 4 de Agosto de 2009, 17:50
A criação do xml está dando certo, estou utilizando o escape. Então referente a criação está tudo Ok.
Mas o problema ainda persiste, quando envio a NFe para a sefaz, está retornando Falha de schema. Pode ser algum problema no ambiente de homologação ou talvez outra coisa errada no xml, mas acho dificil, pq quando eu tiro o destinatario que é o único que está com caracter especial, o envio da certo. Vou tentar resolver aqui.
Agradeço a ajuda de todos
Bruno Borges
____________________________________________________________________________________
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com
[As partes desta mensagem que não continham texto foram removidas]
2009/8/4 bruno.borges100 <bruno....@gmail.com>:
>
>
> A criação do xml está dando certo, estou utilizando o escape. Então
> referente a criação está tudo Ok.
>
> Mas o problema ainda persiste, quando envio a NFe para a sefaz, está
> retornando Falha de schema. Pode ser algum problema no ambiente de
> homologação ou talvez outra coisa errada no xml, mas acho dificil, pq quando
> eu tiro o destinatario que é o único que está com caracter especial, o envio
> da certo. Vou tentar resolver aqui.
>
> Agradeço a ajuda de todos
> Bruno Borges
>
>
--
Daniel Gonçalves
Base4 Sistemas Ltda.
[www.base4.com.br]
[twitter.com/spanazzi]
Bruno Borges
--- Em python...@yahoogrupos.com.br, Pablo Grigoletti <pablogrigoletti@...> escreveu
>
> Dá uma olhada no manual da sefaz...
> Se não me engano nao pode ter caracteres especiais, acentos, ...
>
> --- Em ter, 4/8/09, bruno.borges100 <bruno.python@...> escreveu:
E aí que fim levou então? Deu tudo certo a geração do XML para a NFe?
Ainda não está sendo aceito, estou verificando com o pessoal da Sefaz o que pode está acontecendo. Quando esse problema for resolvido eu posto aqui o que era.
Bruno Borges
--- Em python...@yahoogrupos.com.br, Danilo Cabello <danilo.cabello@...> escreveu
>
> 2009/8/5 bruno.borges100 <bruno.python@...>:
"""
Bom dia Bruno,
Para a codificação UTF-8 o caracter "&" não é representado pelos códigos "&". Estes códigos se refere àquele caracter na linguagem HTML. Verifique o padrão UTF-8 para o preenchimento correto das informações da NFe.
Atenciosamente,
Hugo Marciano de Melo
Analista de Sistemas e Suporte - Nota Fiscal Eletronica
Secretaria da Fazenda do Estado de Goias
o restante do xml está correto pois eu alterei o nome para "AGUIAR SILVA LTDA" e gerei novamente o xml de envio resultando em
<xNome>AGUIAR SILVA LTDA</xNome> e a nota foi autorizada.
:[
Qualquer novidade posto aqui
Bruno Borges
--- Em python...@yahoogrupos.com.br, Daniel Gonçalves <daniel@...> escreveu
>
> Bruno, também tenho interesse nestes detalhes de NFe. Poste o XML no
> "Lodge It" (ou qualquer outro) para nós. Quem sabe?! :-)
>
> 2009/8/4 bruno.borges100 <bruno.python@...>:
2009/8/5 bruno.borges100 <bruno....@gmail.com>:
>
>
> De acordo com a SEFAZ:
>
> """
> Bom dia Bruno,
>
> Para a codificação UTF-8 o caracter "&" não é representado pelos códigos
> "&". Estes códigos se refere àquele caracter na linguagem HTML.
> Verifique o padrão UTF-8 para o preenchimento correto das informações da
> NFe.
>
> Atenciosamente,
>
> Hugo Marciano de Melo
> Analista de Sistemas e Suporte - Nota Fiscal Eletronica
> Secretaria da Fazenda do Estado de Goias
> """
>
>
--
Daniel Gonçalves
Base4 Sistemas Ltda.
[www.base4.com.br]
[twitter.com/spanazzi]
O Hugo, do SEFAZ referiu-se ao HTML como se fosse uma "outra coisa".
HTML é um sub-conjunto de XML.
Muito estranho! Mesmo por que, a coisa comum do mundo é o tal "E
comercial" em razões sociais.
2009/8/5 bruno.borges100 <bruno....@gmail.com>:
>
>
> De acordo com a SEFAZ:
>
> """
> Bom dia Bruno,
>
> Para a codificação UTF-8 o caracter "&" não é representado pelos códigos
> "&". Estes códigos se refere àquele caracter na linguagem HTML.
> Verifique o padrão UTF-8 para o preenchimento correto das informações da
> NFe.
>
> Atenciosamente,
>
> Hugo Marciano de Melo
> Analista de Sistemas e Suporte - Nota Fiscal Eletronica
> Secretaria da Fazenda do Estado de Goias
> """
>
>
--
Daniel Gonçalves
Base4 Sistemas Ltda.
[www.base4.com.br]
[twitter.com/spanazzi]
concordo - e não só pelo lado do XML, mas:
>
> 2009/8/5 bruno.borges100 <bruno....@gmail.com>:
> > De acordo com a SEFAZ:
> >
> > """
> > Bom dia Bruno,
> >
> > Para a codificação UTF-8 o caracter "&" não é representado pelos códigos
> > "&". Estes códigos se refere àquele caracter na linguagem HTML.
> > Verifique o padrão UTF-8 para o preenchimento correto das informações da
> > NFe.
> >
> > Atenciosamente,
> >
> > Hugo Marciano de Melo
> > Analista de Sistemas e Suporte - Nota Fiscal Eletronica
> > Secretaria da Fazenda do Estado de Goias
> > """
Bom "&" em utf-8 é exatamente igual "&" em ASCII -- o caractere representado
pelo código "38" ou seja: o que ele falou também não faz o menor sentido por
aqui.
Sou novo aqui na lista e estou ainda "engatinhando" em Python. Mas estou
vendo o pessoal se debatendo com um problema com XML que, a princípio,
nem é Python. Então posso ajudar !!! Tenho um pouquinho de conhecimento
de XML pois programo com PHP há algum tempo e já me deparei com alguns
problemas deste tipo, mas nada com o governo!!!
http://xml.silmaril.ie/authors/specials/
Neste artigo, o autor coloca que, sem definir o DTD, o XML assume
algumas formas padrão para ALGUNS caracteres especiais. Em HTML 4, segue
uma tabela com as notações em código mnemônico e em o código numérico,
no link abaixo.
http://www.laughtergenealogy.com/bin/header/ascii3.html
Dá uma olhada neste post aqui e vê se tem algo assim (o DTD) na NFe.
Assim já dá para eu entender como a NFe funciona (se é que funciona....).
Abraço.
Ricardo
http://www.macoratti.net/vb_xml2.htm
bruno.borges100 escreveu:
Tu já tentou validar o seu XML? Na tua máquina mesmo.
Talvez o retorno do erro seja mais amigável ou mais detalhado.
Até,
2009/8/5 bruno.borges100 <bruno....@gmail.com>
>
>
> De acordo com a SEFAZ:
>
> """
> Bom dia Bruno,
>
> Para a codificação UTF-8 o caracter "&" não é representado pelos códigos
> "&". Estes códigos se refere àquele caracter na linguagem HTML.
> Verifique o padrão UTF-8 para o preenchimento correto das informações da
> NFe.
>
> Atenciosamente,
>
> Hugo Marciano de Melo
> Analista de Sistemas e Suporte - Nota Fiscal Eletronica
> Secretaria da Fazenda do Estado de Goias
> """
>
>
>
--
Armando Roque Ferreira Pinto
Analista de sistemas
(65) 8116 8844
[As partes desta mensagem que não continham texto foram removidas]
------------------------------------
O xml está correto, está sendo gerado normalmente, depois abro ele e ta tudo blz. O problema é que o servidor da Sefaz não está aceitando ele. Já deixou de ser um problema de xml, agora é apenas um problema de Nota Fiscal Eletrônica.
--- Em python...@yahoogrupos.com.br, Armando Roque <dropsdef@...> escreveu
>
> Bruno,
>
> Tu já tentou validar o seu XML? Na tua máquina mesmo.
> Talvez o retorno do erro seja mais amigável ou mais detalhado.
>
> Até,
>
> 2009/8/5 bruno.borges100 <bruno.python@...>
Dei uma olhada nos links passados, usando os códigos numéricos também tivemos problemas, uma vez que ele resultou no mesmo código padrão.
Imagino que o problema não seja mais de xml, apenas de nota fiscal eletrônica.
Agradeço a colaboração
Bruno Borges
--- Em python...@yahoogrupos.com.br, José Ricardo Borba <jrborba.rs@...> escreveu
>
> Pessoal,
>
> Sou novo aqui na lista e estou ainda "engatinhando" em Python. Mas estou
> vendo o pessoal se debatendo com um problema com XML que, a princípio,
> nem é Python. Então posso ajudar !!! Tenho um pouquinho de conhecimento
> de XML pois programo com PHP há algum tempo e já me deparei com alguns
> problemas deste tipo, mas nada com o governo!!!
>
> http://xml.silmaril.ie/authors/specials/
>
> Neste artigo, o autor coloca que, sem definir o DTD, o XML assume
> algumas formas padrão para ALGUNS caracteres especiais. Em HTML 4, segue
> uma tabela com as notações em código mnemônico e em o código numérico,
> no link abaixo.
>
> http://www.laughtergenealogy.com/bin/header/ascii3.html
>
> Dá uma olhada neste post aqui e vê se tem algo assim (o DTD) na NFe.
> Assim já dá para eu entender como a NFe funciona (se é que funciona....).
>
> Abraço.
>
> Ricardo
>
> http://www.macoratti.net/vb_xml2.htm
------------------------------------
2009/8/6 bruno.borges100 <bruno....@gmail.com>:
>
>
> Tivemos progresso, com o uso do código numérico!
>
> Fui direto na string final (leitura do xml que foi gerado) peguei o código
> & que estava nela e substitui pelo seu código que é &
>
> Essa string foi enviada e aceita.
>
> =D
> :]
>
> Ou seja, no final é necessário que os caracteres especiais estejam
> substituídos pelos seus códigos numéricos. O uso da função 'escape' resulta
> em:
>
> escape(&)
> &
>
o 38 é o código UNICODE (não utf-8) do caracter "&". Sabendo isto, vc
pode fazer algo como:
import string
strings_validas = string.letters + string.digits + ' '
st = "S & M Indústria e Comércio"
print "".join([s if s in strings_validas else "&#%s;" % ord(s) for s in st])
> Agora vou ver um modo prático de pegar o código numérico...
>
> Bruno Borges
>
> --- Em python...@yahoogrupos.com.br, José Ricardo Borba <jrborba.rs@...>
> escreveu
>>
>> Pessoal,
>>
>> Sou novo aqui na lista e estou ainda "engatinhando" em Python. Mas estou
>> vendo o pessoal se debatendo com um problema com XML que, a princípio,
>> nem é Python. Então posso ajudar !!! Tenho um pouquinho de conhecimento
>> de XML pois programo com PHP há algum tempo e já me deparei com alguns
>> problemas deste tipo, mas nada com o governo!!!
>>
>> http://xml.silmaril.ie/authors/specials/
>>
>> Neste artigo, o autor coloca que, sem definir o DTD, o XML assume
>> algumas formas padrão para ALGUNS caracteres especiais. Em HTML 4, segue
>> uma tabela com as notações em código mnemônico e em o código numérico,
>> no link abaixo.
>>
>> http://www.laughtergenealogy.com/bin/header/ascii3.html
>>
>> Dá uma olhada neste post aqui e vê se tem algo assim (o DTD) na NFe.
>> Assim já dá para eu entender como a NFe funciona (se é que funciona....).
>>
>> Abraço.
>>
>> Ricardo
>>
>> http://www.macoratti.net/vb_xml2.htm
>
>
--
Rodolfo Carvalho
Web Developer
rodol...@gmail.com
Fui direto na string final (leitura do xml que foi gerado) peguei o código & que estava nela e substitui pelo seu código que é &
Essa string foi enviada e aceita.
=D
:]
Ou seja, no final é necessário que os caracteres especiais estejam substituídos pelos seus códigos numéricos. O uso da função 'escape' resulta em:
escape(&)
&
Agora vou ver um modo prático de pegar o código numérico...
Bruno Borges
--- Em python...@yahoogrupos.com.br, José Ricardo Borba <jrborba.rs@...> escreveu
>
> Pessoal,
>
> Sou novo aqui na lista e estou ainda "engatinhando" em Python. Mas estou
> vendo o pessoal se debatendo com um problema com XML que, a princípio,
> nem é Python. Então posso ajudar !!! Tenho um pouquinho de conhecimento
> de XML pois programo com PHP há algum tempo e já me deparei com alguns
> problemas deste tipo, mas nada com o governo!!!
>
> http://xml.silmaril.ie/authors/specials/
>
> Neste artigo, o autor coloca que, sem definir o DTD, o XML assume
> algumas formas padrão para ALGUNS caracteres especiais. Em HTML 4, segue
> uma tabela com as notações em código mnemônico e em o código numérico,
> no link abaixo.
>
> http://www.laughtergenealogy.com/bin/header/ascii3.html
>
> Dá uma olhada neste post aqui e vê se tem algo assim (o DTD) na NFe.
> Assim já dá para eu entender como a NFe funciona (se é que funciona....).
>
> Abraço.
>
> Ricardo
>
> http://www.macoratti.net/vb_xml2.htm
2009/8/6 Rodolfo S. Carvalho <rodol...@gmail.com>:
> bruno,
>
> 2009/8/6 bruno.borges100 <bruno....@gmail.com>:
>>
>>
>> Tivemos progresso, com o uso do código numérico!
>>
>> Fui direto na string final (leitura do xml que foi gerado) peguei o código
>> & que estava nela e substitui pelo seu código que é &
>>
>> Essa string foi enviada e aceita.
>>
>> =D
>> :]
>>
>> Ou seja, no final é necessário que os caracteres especiais estejam
>> substituídos pelos seus códigos numéricos. O uso da função 'escape' resulta
>> em:
>>
>> escape(&)
>> &
>>
>
> o 38 é o código UNICODE (não utf-8) do caracter "&". Sabendo isto, vc
> pode fazer algo como:
>
> import string
> strings_validas = string.letters + string.digits + ' '
> st = "S & M Indústria e Comércio"
o "st" precisa ser do tipo 'unicode':
st = u"S & M Indústria e Comércio"
>
> print "".join([s if s in strings_validas else "&#%s;" % ord(s) for s in st])
>
S & M Indústria e Comércio
Sim, é um problema da NFE mesmo. Pelo que eu me lembre, na empresa
em que eu trabalhava antes. Os caras chegaram a tirar os acentos dos nomes
por que senão as notas eram recusadas.
Eu suspeito que o parser deles tenha sido programado em perl usando
expressões regulares pelo estagiário. Porque não tem sentido essas
explicações que eles mandam.
Obrigado
Bruno Borges
<rodolfo.ueg@...> escreveu
>
> bruno,
>
> 2009/8/6 bruno.borges100 <bruno.python@...>:
> >
> >
> > Tivemos progresso, com o uso do código numérico!
> >
> > Fui direto na string final (leitura do xml que foi gerado) peguei o código
> > & que estava nela e substitui pelo seu código que é &
> >
> > Essa string foi enviada e aceita.
> >
> > =D
> > :]
> >
> > Ou seja, no final é necessário que os caracteres especiais estejam
> > substituídos pelos seus códigos numéricos. O uso da função 'escape' resulta
> > em:
> >
> > escape(&)
> > &
> >
>
> o 38 é o código UNICODE (não utf-8) do caracter "&". Sabendo isto, vc
> pode fazer algo como:
>
> import string
> strings_validas = string.letters + string.digits + ' '
> st = "S & M Indústria e Comércio"
>
> print "".join([s if s in strings_validas else "&#%s;" % ord(s) for s in st])
>
> > Agora vou ver um modo prático de pegar o código numérico...
> >
> > Bruno Borges
> >
> > --- Em python...@yahoogrupos.com.br, José Ricardo Borba <jrborba.rs@>
> > escreveu
> >>
> >> Pessoal,
> >>
> >> Sou novo aqui na lista e estou ainda "engatinhando" em Python. Mas estou
> >> vendo o pessoal se debatendo com um problema com XML que, a princípio,
> >> nem é Python. Então posso ajudar !!! Tenho um pouquinho de conhecimento
> >> de XML pois programo com PHP há algum tempo e já me deparei com alguns
> >> problemas deste tipo, mas nada com o governo!!!
> >>
> >> http://xml.silmaril.ie/authors/specials/
> >>
> >> Neste artigo, o autor coloca que, sem definir o DTD, o XML assume
> >> algumas formas padrão para ALGUNS caracteres especiais. Em HTML 4, segue
> >> uma tabela com as notações em código mnemônico e em o código numérico,
> >> no link abaixo.
> >>
> >> http://www.laughtergenealogy.com/bin/header/ascii3.html
> >>
> >> Dá uma olhada neste post aqui e vê se tem algo assim (o DTD) na NFe.
> >> Assim já dá para eu entender como a NFe funciona (se é que funciona....).
> >>
> >> Abraço.
> >>
> >> Ricardo
> >>
> >> http://www.macoratti.net/vb_xml2.htm
> >
> >
>
>
>
> --
> Rodolfo Carvalho
> Web Developer
> rodolfo.ueg@...
>>> ord (u"&")
38
>>> ord (u"&".encode("utf8"))
38
>>> ord (u"&".encode("cp1252"))
38
>>> ord (u"&".encode("ASCII"))
38
----------
(as vezes é bom saber do que está falando antes de escrever pra lista)
Rans a parte, sugiro a todos os que tiverem qualquer dúvida sorbe unicode,
utf-8, encodings (não xml - isso é outro assunto ) -
a lerem a página http://www.python.org.br/wiki/PythonUnicode
js
-><-