Sobre este problema HTML
O atributo xmlns define o namespace XML para um elemento. Para SVG, o namespace correto é http://www.w3.org/2000/svg, declarado com xmlns="http://www.w3.org/2000/svg". O atributo xmlns:svg tenta declarar uma vinculação de namespace prefixado adicional — essencialmente mapeando o prefixo svg: para o mesmo URI de namespace. Isto é redundante porque o namespace padrão (sem prefixo) já cobre todos os elementos SVG.
No HTML5, o parser gere os namespaces internamente. A especificação HTML apenas permite um pequeno conjunto de atributos de namespace: xmlns em certos elementos (como <svg> e <math>) e xmlns:xlink para compatibilidade legada. Declarações de namespace prefixado arbitrárias como xmlns:svg não fazem parte do formato de serialização HTML. O validador W3C levanta este erro porque atributos contendo dois pontos nos seus nomes locais (além daqueles especificamente permitidos) não podem ser processados de forma bidirecional através do parser e serializador HTML — não são “serializáveis como XML 1.0.”
Porque isto importa
-
Conformidade com padrões: O HTML5 tem regras rigorosas sobre quais declarações de namespace são permitidas. Usar
xmlns:svgviola estas regras. -
Problemas de serialização: Se um browser analisar o HTML e depois o re-serializar (por exemplo, via
innerHTML), o atributoxmlns:svgpode ser perdido, alterado ou causar comportamento inesperado porque está fora do conjunto de atributos serializáveis. -
Redundância: Mesmo em documentos XML/SVG puros, declarar
xmlns:svg="http://www.w3.org/2000/svg"juntamente comxmlns="http://www.w3.org/2000/svg"é desnecessário. O namespace padrão já se aplica ao elemento<svg>e a todos os seus descendentes sem prefixo.
Como corrigir
-
Localize o elemento
<svg>(ou qualquer elemento) que contém o atributoxmlns:svg. -
Remova
xmlns:svg="http://www.w3.org/2000/svg"inteiramente. -
Certifique-se de que o atributo padrão
xmlns="http://www.w3.org/2000/svg"permanece se necessário (note que quando incorpora SVG inline num documento HTML5, até mesmoxmlnsé opcional visto que o parser HTML infere o namespace automaticamente).
Exemplos
Incorreto: declaração de namespace prefixado redundante
<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<circle cx="50" cy="50" r="40" fill="blue" />
</svg>
O atributo xmlns:svg desencadeia o erro de validação porque não é serializável em HTML.
Correto: apenas namespace padrão
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<circle cx="50" cy="50" r="40" fill="blue" />
</svg>
Correto: SVG inline em HTML5 sem qualquer atributo de namespace
Quando o SVG é incorporado diretamente num documento HTML5, o parser HTML atribui automaticamente o namespace correto, por isso pode omitir xmlns completamente:
<svg viewBox="0 0 100 100">
<circle cx="50" cy="50" r="40" fill="blue" />
</svg>
Isto é perfeitamente válido e é o padrão mais comum para SVG inline em HTML moderno. O atributo xmlns só é estritamente necessário quando o SVG é servido como um ficheiro XML autónomo (com uma extensão .svg ou um tipo de conteúdo image/svg+xml).
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.