Validação do XML com DOMDocument:: schemaValidate ()

881 views
Skip to first unread message

André Machado

unread,
Aug 20, 2010, 9:08:15 AM8/20/10
to NFePHP
Olá,
Estou efetuando a validação de uma nota na versão 2.00 com o método
schemaValidate da classe DOMDocument. A versão do schema que estou
utilizando é a versão “PL_006e”, que já está disponível para o
ambiente de homologação segundo http://www.nfe.fazenda.gov.br/. Ao
efetuar a validação ele me imprime 5 erros (sendo que o último é por
causa que a nota esta sem assinatura), são eles:
número de Erros: 5
LibXMLError Object
(
[level] => 2
[code] => 1839
[column] => 0
[message] => Element '{http://www.portalfiscal.inf.br/nfe}nro':
[facet 'pattern'] The value '41' is not accepted by the pattern '[!-ÿ]
{1}[ -ÿ]{0,}[!-ÿ]{1}|[!-ÿ]{1}'.

[file] => file:///D:/projetosWeb/trabalhoLocal/XMLS_teste/copianovaNFE2.xml
[line] => 49
)
LibXMLError Object
(
[level] => 2
[code] => 1824
[column] => 0
[message] => Element '{http://www.portalfiscal.inf.br/nfe}nro':
'41' is not a valid value of the local atomic type.

[file] => file:///D:/projetosWeb/trabalhoLocal/XMLS_teste/copianovaNFE2.xml
[line] => 49
)
LibXMLError Object
(
[level] => 2
[code] => 1839
[column] => 0
[message] => Element '{http://www.portalfiscal.inf.br/nfe}IE':
[facet 'pattern'] The value '' is not accepted by the pattern 'ISENTO|
[0-9]{0,14}|PR[0-9]{4,8}'.

[file] => file:///D:/projetosWeb/trabalhoLocal/XMLS_teste/copianovaNFE2.xml
[line] => 59
)
LibXMLError Object
(
[level] => 2
[code] => 1824
[column] => 0
[message] => Element '{http://www.portalfiscal.inf.br/nfe}IE': ''
is not a valid value of the atomic type '{http://
www.portalfiscal.inf.br/nfe}TIeDest'.

[file] => file:///D:/projetosWeb/trabalhoLocal/XMLS_teste/copianovaNFE2.xml
[line] => 59
)
LibXMLError Object
(
[level] => 2
[code] => 1871
[column] => 0
[message] => Element '{http://www.portalfiscal.inf.br/nfe}NFe':
Missing child element(s). Expected is ( {http://www.w3.org/2000/09/
xmldsig#}Signature ).

[file] => file:///D:/projetosWeb/trabalhoLocal/XMLS_teste/copianovaNFE2.xml
[line] => 2
)


O problema é que ao fazer a validação pelo site do sefaz RS
http://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx, A nota está OK, sem erro
nenhum. Queria saber se alguém pode me ajudar!!!.
Desde já agradeço.

Abaixo, a nota e o código php
<?xml version="1.0" encoding="utf-8"?>
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe versao="2.00"
Id="NFe35100810752305000103550010000000071001241174">
<ide>
<cUF>35</cUF>
<cNF>00124117</cNF>
<natOp>2</natOp>
<indPag>0</indPag>
<mod>55</mod>
<serie>1</serie>
<nNF>7</nNF>
<dEmi>2010-08-18</dEmi>
<dSaiEnt>2010-08-18</dSaiEnt>
<hSaiEnt>16:00:00</hSaiEnt>
<tpNF>1</tpNF>
<cMunFG>3541000</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>4</cDV>
<tpAmb>2</tpAmb>
<finNFe>1</finNFe>
<procEmi>0</procEmi>
<verProc>1.0</verProc>
</ide>
<emit>
<CNPJ>11111111111111</CNPJ>
<xNome>xxxxxx</xNome>
<xFant>xxxx</xFant>
<enderEmit>
<xLgr>xxxx</xLgr>
<nro>164</nro>
<xCpl>cj 53</xCpl>
<xBairro>xxxxxx</xBairro>
<cMun>3548500</cMun>
<xMun>xxxxxxx</xMun>
<UF>SP</UF>
<CEP>11051000</CEP>
<cPais>1058</cPais>
<xPais>Brasil</xPais>
</enderEmit>
<IE>111111111111</IE>
<CRT>1</CRT>
</emit>
<dest>
<CNPJ>04663622000150</CNPJ>
<xNome>jorge bar me</xNome>
<enderDest>
<xLgr>xxxxxxxxxxx</xLgr>
<nro>41</nro>
<xCpl>casa</xCpl>
<xBairro>xxxxxx</xBairro>
<cMun>3541000</cMun>
<xMun>Praia Grande</xMun>
<UF>SP</UF>
<CEP>11712000</CEP>
<cPais>1058</cPais>
<xPais>BRASIL</xPais>
</enderDest>
<IE/>
</dest>
<det nItem="1">
<prod>
<cProd>1</cProd>
<cEAN/>
<xProd>Web Site</xProd>
<NCM>12378978</NCM>
<CFOP>5401</CFOP>
<uCom>1</uCom>
<qCom>0.0001</qCom>
<vUnCom>0.0000000001</vUnCom>
<vProd>0.01</vProd>
<cEANTrib/>
<uTrib>1</uTrib>
<qTrib>0.0001</qTrib>
<vUnTrib>0.0000000001</vUnTrib>
<vFrete>0.01</vFrete>
<vSeg>0.01</vSeg>
<vDesc>0.01</vDesc>
<indTot>0</indTot>
</prod>
<imposto>
<ICMS>
<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>0</modBC>
<vBC>0.01</vBC>
<pICMS>0.01</pICMS>
<vICMS>0.01</vICMS>
</ICMS00>
</ICMS>
<IPI>
<clEnq>1</clEnq>
<cSelo>1</cSelo>
<qSelo>1</qSelo>
<cEnq>1</cEnq>
<IPINT>
<CST>02</CST>
</IPINT>
</IPI>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>0.01</vBC>
<pPIS>0.01</pPIS>
<vPIS>0.01</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>01</CST>
<vBC>0.01</vBC>
<pCOFINS>0.01</pCOFINS>
<vCOFINS>0.01</vCOFINS>
</COFINSAliq>
</COFINS>
</imposto>
</det>
<total>
<ICMSTot>
<vBC>1.00</vBC>
<vICMS>0.01</vICMS>
<vBCST>1.00</vBCST>
<vST>0.01</vST>
<vProd>0.01</vProd>
<vFrete>0.01</vFrete>
<vSeg>0.01</vSeg>
<vDesc>0.01</vDesc>
<vII>0.01</vII>
<vIPI>0.01</vIPI>
<vPIS>0.01</vPIS>
<vCOFINS>0.01</vCOFINS>
<vOutro>0.01</vOutro>
<vNF>0.02</vNF>
</ICMSTot>
<ISSQNtot/>
<retTrib/>
</total>
<transp>
<modFrete>0</modFrete>
</transp>
</infNFe>
</NFe>


O Codigo:

<?php
function print_r_pre($valor){
echo "<pre>";
print_r($valor);
echo "</pre>";
}
if(!defined('sugarEntry'))define('sugarEntry', true);

libxml_use_internal_errors(true);
/* Cria um novo objeto da classe DomDocument */
$objDom = new DOMDocument('1.0','utf-8');
echo $objDom->xmlEncoding;
/* Carrega o arquivo XML */
$arquivoAValidar = "XMLS_teste/copianovaNFE2.xml";

$objDom->load($arquivoAValidar);

/* Tenta validar os dados utilizando o arquivo XSD */
if (!$objDom->schemaValidate("schema_XML/PL_006e/nfe_v2.00.xsd")) {
// if (!$objDom->schemaValidate("schema_XML/PL_005d/
consSitNFe_v1.07.xsd")) {

$arrayAllErrors = libxml_get_errors();
/* Cada elemento do array $arrayAllErrors ser� um objeto do tipo
LibXmlError */
echo "<br> XML <b>: ".$arquivoAValidar."</b><br>";
echo "<br> n&uacute;mero de Erros:
".count($arrayAllErrors)."<br>";
for($i=0; $i<count($arrayAllErrors); $i++){
print_r_pre($arrayAllErrors[$i]);
}

} else {

/* XML validado! */
echo "XML <b>".$arquivoAValidar."</b> obedece as regras definidas
no arquivo XSD!";
}
?>

Roberto L. Machado

unread,
Aug 20, 2010, 10:08:06 AM8/20/10
to nfe...@googlegroups.com
André;

O sistema não aceita tags fechadas ex.

<IE/>

Roberto

FerreiraH.

unread,
Aug 20, 2010, 2:42:32 PM8/20/10
to nfe...@googlegroups.com
O mais interessante é que a inscrição deve conter ISENTO ou 14 digitos ou <IE/> pelo menos no manual do ver1
Quando isso ocorre comigo eu envio para o sefaz de São Paulo e o SEFAZ aceita .
possivel erro

no manual do versão 3 2009

Informar a IE quando o destinatário
for contribuinto do ICMS.
Informar ISENTO quando o
destinatário for contribuinto do
ICMS, mas não estiver obrigado à
inscrição no cadastro de
contribuintes do ICMS.
Não informar o conteúdo da TAG
se o destinatário não for
contribuinte do ICMS.
Esta tag aceita apenas:
. ausência de conteúdo (<IE></IE>
ou <IE/>) para destinatários não
contribuintes do ICMS;
. algarismos para destinatários
contribuintes do ICMS, sem
caracteres de formatação (ponto,
barra, hífen, etc.);
. literal “ISENTO” para destinatários
contribuintes do ICMS que são
isentos de inscrição no cadastro de
contribuintes do ICMS;


--
Ferreira Helder
B2Stok.net ERP Php5-Gtk2
PhpGtkEditor
PhpSDL
PhpGladeTools
Voce pode colaborar

André Machado

unread,
Aug 23, 2010, 8:38:26 AM8/23/10
to NFePHP
OK, mas e quanto a o lemento <nro></nro> que também está com
problemas..., já não sei mais o que faço, o jeito que tem é enviar
assim mesmo...


Se alguém tiver uma solução, porque pelo que vejo existe alguma
particularidade no método schemaValidate que está trazendo estes
problemas na Nota ao qual tecnicamente não deveria existir..., não sei
se alguém conhecer outra maneira de fazer esta validação, outra classe
ou se a classe DOMDocument tem algum tipo de atualizacão. Pode ser
também que eu precise fazer algo no meu código que deixei passar....

desde já eu agradeço!

On 20 ago, 11:08, "Roberto L. Machado"
<roberto.mach...@superig.com.br> wrote:
> André;
>
> O sistema não aceita tags fechadas ex.
>
> <IE/>
>
> Roberto
>
> Em Sex, 2010-08-20 às 06:08 -0700, André Machado escreveu:
>
> > Olá,
> > Estou efetuando a validação de uma nota na versão 2.00 com o método
> > schemaValidate da classe DOMDocument. A versão do schema que estou
> > utilizando é a versão “PL_006e”, que já está disponível para o
> > ambiente de homologação segundohttp://www.nfe.fazenda.gov.br/. Ao

Edmar Wiggers

unread,
Aug 23, 2010, 4:20:03 PM8/23/10
to nfe...@googlegroups.com
Oi André,

Sobre o <nro></nro>, se for o endereço do destinatário qdo não tem
número eu preencho com "S/N" (<nro>S/N</nro>).

Abraço

Em 23 de agosto de 2010 09:38, André Machado
<andre.l...@gmail.com> escreveu:

> --
> Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
> Para Postar: nfe...@googlegroups.com
> Para Sair do Grupo: nfephp+un...@googlegroups.com
> Link: http://groups.google.com.br/group/nfephp?hl=pt-BR
> -------
> FAQ: https://www.assembla.com/wiki/show/nfephp/FAQ
> Como Participar: https://www.assembla.com/wiki/show/nfephp/Como_participar
> Como Utilizar: http://www.assembla.com/wiki/show/nfephp/Como_utilizar
>

--
Edmar Wiggers
Macrovita Alimentos
Tel.: 48-3233-4615 / 48-9966-0074
Email: e...@macrovita.com.br
Web: www.macrovita.com.br

André Machado

unread,
Aug 24, 2010, 8:53:48 AM8/24/10
to NFePHP
Valeu pela orça ai Edmar Wiggers, mas a tag <nro></nro> está
preenchido com o valor 41 e mesmo assim acorre este erro... é mesmo
muito estranho. E o pior é que quando eu troco por qualquer valor 1,
100, 20, 30 o erro de validação some....

Abraço a todos que estão me ajudando...

On 23 ago, 17:20, Edmar Wiggers <e...@macrovita.com.br> wrote:
> Oi André,
>
> Sobre o <nro></nro>, se for o endereço do destinatário qdo não tem
> número eu preencho com "S/N" (<nro>S/N</nro>).
>
> Abraço
>
> Em 23 de agosto de 2010 09:38, André Machado
> <andre.luiz.k...@gmail.com> escreveu:
> ...
>
> mais »

FerreiraH.

unread,
Aug 24, 2010, 12:19:45 PM8/24/10
to nfe...@googlegroups.com
Já vi alguem relatar um bug com numeros de duplicata ou fatura entre 10 e 99 os outros passam
No seu caso so acontece com numero 41 vou testar e te falo
Coloquei o numero de cliente como 41 em uma nota aqui e ela assinou e validou




--

André Machado

unread,
Aug 25, 2010, 8:21:51 AM8/25/10
to NFePHP
Obrigado Ferreira aguardo o seu contato.

On 24 ago, 13:19, "FerreiraH." <helder.maurici...@gmail.com> wrote:
> Já vi alguem relatar um bug com numeros de duplicata ou fatura entre 10 e 99
> os outros passam
> No seu caso so acontece com numero 41 vou testar e te falo
> Coloquei o numero de cliente como 41 em uma nota aqui e ela assinou e
> validou
>
> Em 24 de agosto de 2010 09:53, André Machado
> <andre.luiz.k...@gmail.com>escreveu:
> > > >> >     [message] => Element '{http://www.portalfiscal.inf.br/nfe}nro<http://www.portalfiscal.inf.br/nfe%7Dnro>
> > ':
> > > >> > [facet 'pattern'] The value '41' is not accepted by the pattern
> > '[!-ÿ]
> > > >> > {1}[ -ÿ]{0,}[!-ÿ]{1}|[!-ÿ]{1}'.
>
> > > >> >     [file] =>
> > file:///D:/projetosWeb/trabalhoLocal/XMLS_teste/copianovaNFE2.xml
> > > >> >     [line] => 49
> > > >> > )
> > > >> > LibXMLError Object
> > > >> > (
> > > >> >     [level] => 2
> > > >> >     [code] => 1824
> > > >> >     [column] => 0
> > > >> >     [message] => Element '{http://www.portalfiscal.inf.br/nfe}nro<http://www.portalfiscal.inf.br/nfe%7Dnro>
> > ':
> > > >> > '41' is not a valid value of the local atomic type.
>
> > > >> >     [file] =>
> > file:///D:/projetosWeb/trabalhoLocal/XMLS_teste/copianovaNFE2.xml
> > > >> >     [line] => 49
> > > >> > )
> > > >> > LibXMLError Object
> > > >> > (
> > > >> >     [level] => 2
> > > >> >     [code] => 1839
> > > >> >     [column] => 0
> > > >> >     [message] => Element '{http://www.portalfiscal.inf.br/nfe}IE<http://www.portalfiscal.inf.br/nfe%7DIE>
> > ':
> > > >> > [facet 'pattern'] The value '' is not accepted by the pattern
> > 'ISENTO|
> > > >> > [0-9]{0,14}|PR[0-9]{4,8}'.
>
> > > >> >     [file] =>
> > file:///D:/projetosWeb/trabalhoLocal/XMLS_teste/copianovaNFE2.xml
> > > >> >     [line] => 59
> > > >> > )
> > > >> > LibXMLError Object
> > > >> > (
> > > >> >     [level] => 2
> > > >> >     [code] => 1824
> > > >> >     [column] => 0
> > > >> >     [message] => Element '{http://www.portalfiscal.inf.br/nfe}IE<http://www.portalfiscal.inf.br/nfe%7DIE>':
> > ''
> > > >> > is not a valid value of the atomic type '{http://
> > > >> >www.portalfiscal.inf.br/nfe}TIeDest<http://www.portalfiscal.inf.br/nfe%7DTIeDest>
> > '.
>
> > > >> >     [file] =>
> > file:///D:/projetosWeb/trabalhoLocal/XMLS_teste/copianovaNFE2.xml
> > > >> >     [line] => 59
> > > >> > )
> > > >> > LibXMLError Object
> > > >> > (
> > > >> >     [level] => 2
> > > >> >     [code] => 1871
> > > >> >     [column] => 0
> > > >> >     [message] => Element '{http://www.portalfiscal.inf.br/nfe}NFe<http://www.portalfiscal.inf.br/nfe%7DNFe>
> > ':
> ...
>
> mais »

FerreiraH.

unread,
Aug 25, 2010, 11:47:36 AM8/25/10
to nfe...@googlegroups.com
desculpe voce esta tentando validar na ver 2.0
e eu estou falando de ver 1

mas rescrevo aqui uma discução anterior  entre nos Eu Roberto e Edmar Wiggers


A tag <IE/> vazia funciona e é como deve ser feito, nos casos
previstos pela legislação.

Acho q o caso mais comum é quando a NF-e é emitida para pessoa física:
nesse caso deve ser informado CPF ao invés de CNPJ, e a tag IE deve
ser informada com conteúdo vazio (e não ISENTO).

Ferreira, também acredito que você esteja usando um pacote de
liberação desatualizado. Segue conteúdo de TIeDest em
tiposBasico_v1.02.xsd do PL_005d :

       <xs:simpleType name="TIeDest">
               <xs:annotation>
                       <xs:documentation>Tipo Inscrição Estadual do Destinatário //
aperfeiçoado em 24/10/08 para aceitar vazio, ISENTO ou PR9999 a
PR99999999</xs:documentation>
               </xs:annotation>
               <xs:restriction base="xs:string">
                       <xs:whiteSpace value="preserve"/>
                       <xs:pattern value="[0-9]{0,14}|ISENTO|PR[
0-9]{4,8}"/>
               </xs:restriction>
       </xs:simpleType>

Detalhe: O pattern ISENTO|[0-9]{0,14}|PR[0-9]{4,8} q vc tem foi
gentilmente alterado pela Receita para [0-9]{0,14}|ISENTO|PR[0-9]{4,8}
justamente para evitar um bug no libxml com versão < 2.7.3 que impede
a validação correta do pattern iniciando com "ISENTO|...".

O pacote de liberação mais atual é o PL_005f no caso da NF-e leiaute
1.10 (vide http://www.nfe.fazenda.gov.br/portal/schemas.aspx ).

depois voce precisaria abrir o arquivo tiposBasico_v1.02.xsd....
e trocar a linha

trecho do arquivo
<xs:restriction base="xs:string">
            <xs:whiteSpace value="preserve"/>
            <xs:pattern value="[!-ÿ]{1}[ -ÿ]{0,}[!-ÿ]{1}|[!-ÿ]{1}"/>
        </xs:restriction>


deixa assim

<xs:restriction base="xs:string">
            <xs:whiteSpace value="preserve"/>
            <xs:pattern value="[!-ÿ]{1}[ -ÿ]*[!-ÿ]{1}|[!-ÿ]{1}"/>
        </xs:restriction>

Acho q esse erro no caso do Ferreira é devido ao mesmo bug libxml
versão < 2.7.3.

No meu caso, customizei essa parte do xsd mudando {0,} para * . A
validação é a mesma, porém {0,} não funciona direito devido ao bug no
libxml. Tenho essa customização feita no meu sistema atual, PL_005d.
Não lembro devido a qual campo/situação precisei fazer a customização,
mas tenho certeza que foi necessário e não foi devido a
acentos/caracteres especiais.

Ferreira: Não avisei isso antes para não confundir, pq talvez a
customização não fosse necessária no seu caso...

Abraço!

André Machado

unread,
Aug 26, 2010, 8:34:43 AM8/26/10
to NFePHP
Vaeleu Ferreira, vou fazer estas alterações e depois posto aqui o
resultado....
Obrigado!

On 25 ago, 12:47, "FerreiraH." <helder.maurici...@gmail.com> wrote:
> desculpe voce esta tentando validar na ver 2.0
> e eu estou falando de ver 1
>
> mas rescrevo aqui uma discução anterior  entre nos Eu Roberto e Edmar
>             <xs:pattern value="*[!-ÿ]{1}[ -ÿ]{0,}[!-ÿ]{1}|[!-ÿ]{1}*"/>
>         </xs:restriction>
>
> deixa assim
>
> <xs:restriction base="xs:string">
>             <xs:whiteSpace value="preserve"/>
>             <xs:pattern value="*[!-ÿ]{1}[ -ÿ]*[!-ÿ]{1}|[!-ÿ]{1}"*/>

Willian Renan

unread,
Aug 31, 2010, 9:19:44 AM8/31/10
to nfe...@googlegroups.com

FerreiraH.

unread,
Aug 31, 2010, 1:59:36 PM8/31/10
to nfe...@googlegroups.com
parece que não veja um outro poste do Edvandro Mendes cheguei a conclusão que era sobre este assunto

Fiz exatamente o que vc indicou, entretanto não tive solução. Vc conseguiu resolver o problema ????

Olha o retorno que recebo:

Erro: 1818: Internal error: xmlSchemaIDCRegisterMatchers, Could not find an augmented IDC item for an IDC definition.

Erro: 1818: Internal error: xmlSchemaValidateElem, calling xmlSchemaValidateElemDecl().

Erro: 1818: Internal error: xmlSchemaDocWalk, calling xmlSchemaValidateElem().

Atualizei o pacote e fiz o ajuste que vc indicou. Alguma outra sugestão ????

Abçs.

Edvandro.

Ai eu expliquei a ele que este erro só me ocorreu uma vez tentando validar em Windows7 no desktop (eu utilizo php-gtk) e acabei tendo de utilizar o validador em um ubuntu 9.10 um servidor de rede interno e nunca mais apareceu este erro.
IDC definition

Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

Allan Samurai

unread,
Oct 26, 2010, 3:12:42 PM10/26/10
to NFePHP
Boa tarde.

André,

se por acaso não tiver solucionado o problema ate atual momento
o pattern "(ISENTO{0,1})|([0-9]{0,14})" para o tipo simples "TIeDest"
resolveu esse problema para mim.

Att.
Allan Samurai

em 1 set, 10:50, André Machado <andre.luiz.k...@gmail.com> escreveu:
> No caso da tag <IE></IE>
> (substituição de “ISENTO|[0-9]{0,14}|PR[0-9]{4,8}” por “[0-9]
{0,14}|
> ISENTO|PR[0-9]{4,8}”), funcionou colocando tag fechada “<IE/>” e
> também inserindo inscrição estadual “<IE>123456</IE>”, sò que agora
ao
> colocar o atributo “ISENTO” na tag, está apresentando um erro.

André Machado

unread,
Nov 18, 2010, 8:58:22 AM11/18/10
to NFePHP
Olá Allan,

Bom Gostaria de agradecer pela resposta.
Na verdade eu acabei parando neste problema ( tive outras etapas mais
importantes para fazer aqui no projeto ), mas assim que retomar esta
validação, certamente levarei em consideração a sua resposta.

Obrigado!

Giuliano

unread,
Nov 18, 2010, 12:31:52 PM11/18/10
to NFePHP
Senhores,

Tem uma versão mais nova dos schemes, a PL_006g. Talvez seja melhor
testar com ela.

http://nf-eletronica.com/blog/?p=163

Giuliano.
Reply all
Reply to author
Forward
0 new messages