Página 1 de 1

Como ler um arquivo XML com CreateObject("MSXML2.DOMDocumen?

Enviado: 11 Nov 2024 12:47
por clodoaldomonteiro
Olá!

Tentando usar os Objetos da MS para ler XML, no caso o CreateObject("MSXML2.DOMDocument.6.0"), lendo um arquivo XML de dados para informação do TCE daqui.
Sistema teste em xharbour 1.2.3:

Código: Selecionar todos

procedure Sagres_teste()
   Local mArqTemp
   // Cria o objeto MSXML2.DOMDocument para carregar o XML
   objXml := CreateObject("MSXML2.DOMDocument.6.0")
   objXml:async := .F.
   objXml:validateOnParse := .F.
   objXml:setProperty("SelectionNamespaces", "xmlns:esp='http://www.tce.pi.gov.br/sagres2024/xml/especificos' xmlns:aux='http://www.tce.pi.gov.br/sagres2024/xml/cadastrosAuxiliares' xmlns:gen='http://www.tce.pi.gov.br/sagres2024/xml/genericos' xmlns:tab='http://www.tce.pi.gov.br/sagres2024/xml/tabelasInternas'")

   // Define os namespaces e associa os prefixos

   // Carrega o arquivo XML
   mArqTemp := "C:\ValidadorSagres2024\201999\importacao\1\contabil\CadastrosAuxiliares.xml"
   If File(mArqTemp)

      If objXml:load(mArqTemp) == .F.
         MsgError("Erro ao carregar o arquivo XML.")

         If objXml:parseError:errorCode != 0
            myErr := objXml:parseError
            msg := 'Erro ao validar temporário (XML).'
            msg += CRLF + 'Verifique se a pasta existe e se o arquivo está aberto por outra aplicação.'
            msg += CRLF + 'Arquivo Temp: ' + mArqTemp + CRLF

            msg += CRLF + 'Messagem erro: ' + Trim(myErr:reason)
            msg += CRLF + 'Line erro: '     + Str(myErr:Line)
            msg += CRLF + 'Line Pos erro: ' + Str(myErr:linepos)
            msg += CRLF + 'File Pos erro: ' + Str(myErr:filepos)
            msg += CRLF + 'Src Text erro: ' + myErr:srcText
            msg += CRLF + 'url erro: '      + myErr:url

            MsgError( msg )

            objXml := nil

            Return .f.

         Endif
      Endif
   Else
      ? 'Arquivo não encontrado'
      ? CurDir()
      wait
   Endif


   oUnidades := objXml:selectNodes(".//aux:UnidadeOrcamentaria")
   If oUnidades:length == 0
      MsgError("Nenhuma 'UnidadeOrcamentaria' encontrada no XML.")
      Return .f.
   EndIf

   // Loop para processar cada UnidadeOrcamentaria
   FOR i := 0 TO oUnidades:length - 1
      oUnidade := oUnidades:item(i)

      cCodigo := oUnidade:selectSingleNode("aux:codigoUnidOrcamentaria"):text
      cNome   := oUnidade:selectSingleNode("aux:nomeUnidOrcamentaria"):text
      cTipo   := oUnidade:selectSingleNode("aux:tipoUnidOrcamentaria"):text

      // Exibe ou insere os dados na tabela
      ? "Unidade Orçamentária:"
      ? "Código: ", cCodigo
      ? "Nome: ", cNome
      ? "Tipo: ", cTipo

      // Aqui você pode adicionar código para inserir esses dados na tabela, por exemplo:
      // DBAppend() // ou insira na tabela conforme sua necessidade
   NEXT
   wait
   // Pega a lista de elementos "Acao"
   oAcoes := objXml:selectNodes("//aux:Acao")

   // Loop para processar cada Acao
   FOR i := 0 TO oAcoes:length - 1
      oAcao := oAcoes:item(i)

      cCodigoAcao := oAcao:selectSingleNode("aux:codigoAcao"):text
      cDenominacao := oAcao:selectSingleNode("aux:denominacaoAcao"):text
      cTipoAcao := oAcao:selectSingleNode("aux:tipoAcao"):text

      // Exibe ou insere os dados na tabela
      ? "Ação:"
      ? "Código da Ação: ", cCodigoAcao
      ? "Denominação: ", cDenominacao
      ? "Tipo: ", cTipoAcao

      // Aqui você pode adicionar código para inserir esses dados na tabela
   NEXT

   // Libera o objeto XML
   objXml := NIL
   wait
   Return
XML a ser lido:

Código: Selecionar todos

<?xml version="1.0" encoding="utf-8"?>
<!--Arquivo XML para o SAGRES 2024 -->
<!--SIMPLES - Informatica e Consultoria Ltda -->
<!--www.simplesinformatica.com (86) 3223-0653 -->
<!--Sistema: SCP21H-Sistema de Contabilidade Publica -->
<!--Data do Sistema..: 11/11/2024 -  -->
<!--Versao do Sistema: 21.35.04 -->
<!--Versao do DB.....: 21.125 -->
<!--Pasta de Dados...: C:\SimplesInfo\Scp21H\DB2024\A2024_CMJF_CM_JOSE_DE_FREITAS\ -->
<!--XML Criado em....: 11/11/2024, 12:32:47 -->
<!--CNPJ Autorizado..: 07.689.847/0001-74 -->
<!--Emp. Autorizada..: CAMARA MUNICIPAL DE JOSE DE FREITAS -->
<!--Contador respons.: UBIRAJARA RODRIGUES SEPULVEDA -->
<!--Usuario Sistema..: CLODOALDO MONTEIRO & CONSULTORIA -->
<!--IP da maquina....: 10.211.55.8 -->
<!--Nome Maquina Rede: CLODOALDOSM9F4E -->
<!--Usuario Windows..: clodoaldosm -->

<aux:CadastrosAuxiliares xmlns:esp="http://www.tce.pi.gov.br/sagres2024/xml/especificos" xmlns:aux="http://www.tce.pi.gov.br/sagres2024/xml/cadastrosAuxiliares" xmlns:gen="http://www.tce.pi.gov.br/sagres2024/xml/genericos" xmlns:tab="http://www.tce.pi.gov.br/sagres2024/xml/tabelasInternas">

<!--PRESTACAO DE CONTAS =================================================================-->
   <aux:PrestacaoContas>
      <aux:codigoUnidGestora>201999</aux:codigoUnidGestora>
      <aux:nomeUnidGestora>CAMARA MUNICIPAL DE JOSE DE FREITAS</aux:nomeUnidGestora>
      <aux:cpfContador>00000000000</aux:cpfContador>
      <aux:cpfGestor>00000000000</aux:cpfGestor>
      <aux:anoReferencia>2024</aux:anoReferencia>
      <aux:mesReferencia>01</aux:mesReferencia>
      <aux:versaoXml>1</aux:versaoXml>
      <aux:diaInicPresContas>01</aux:diaInicPresContas>
      <aux:diaFinaPresContas>31</aux:diaFinaPresContas>
   </aux:PrestacaoContas>


<!--ORCAMENTO ===========================================================================-->
   <aux:Orcamento>
      <aux:anoVigeLoa>2024</aux:anoVigeLoa>
      <aux:dataPublLoa>2023-12-18</aux:dataPublLoa>
      <aux:percentualAutoSuplLoa>0.00</aux:percentualAutoSuplLoa>
      <aux:numeroLoa>001468</aux:numeroLoa>
      <aux:dataPublLdo>2023-09-14</aux:dataPublLdo>
      <aux:numeroLdo>
         <gen:numero>001458</gen:numero>
         <gen:ano>2023</gen:ano>
      </aux:numeroLdo>
      <aux:numeroLeiPpa>
         <gen:numero>001399</gen:numero>
         <gen:ano>2021</gen:ano>
      </aux:numeroLeiPpa>
      <aux:dataPublPpa>2021-11-30</aux:dataPublPpa>
     <aux:valorRecePrevista>0.00</aux:valorRecePrevista>
     <aux:valorDespFixada>4126000.00</aux:valorDespFixada>
   </aux:Orcamento>


<!--UNIDADE ORCAMENTARIA ================================================================-->

   <aux:UnidadeOrcamentaria> <!--0002-->
      <aux:codigoUnidOrcamentaria>010100</aux:codigoUnidOrcamentaria>
      <aux:nomeUnidOrcamentaria>CAMARA MUNICIPAL</aux:nomeUnidOrcamentaria>
      <aux:tipoUnidOrcamentaria>1</aux:tipoUnidOrcamentaria>
   </aux:UnidadeOrcamentaria>

   <aux:UnidadeOrcamentaria> <!--0002-->
      <aux:codigoUnidOrcamentaria>021300</aux:codigoUnidOrcamentaria>
      <aux:nomeUnidOrcamentaria>SECRETARIA DE ADM. FINANCAS E RECURSOS HUMANOS</aux:nomeUnidOrcamentaria>
      <aux:tipoUnidOrcamentaria>6</aux:tipoUnidOrcamentaria>
   </aux:UnidadeOrcamentaria>

<!--PROGRAMAS DE GOVERNO ================================================================-->

   <aux:Programa>
      <aux:codigoPrograma>0001</aux:codigoPrograma>
      <aux:denominacaoPrograma>AÇAO LEGISLATIVA</aux:denominacaoPrograma>
      <aux:descricaoObjePrograma>OBJETIVO DO PROGRAMA: DESENVOLVER ACOES DENTRO DAS ESPECIFICACOES DO PROGRAMA</aux:descricaoObjePrograma>
      <aux:valorPrevDespCorrPpa>3626000.00</aux:valorPrevDespCorrPpa>
      <aux:valorPrevDespCapiPpa>500000.00</aux:valorPrevDespCapiPpa>
      <aux:tipoPrograma>1</aux:tipoPrograma>
      <aux:numeroLeiCriaAltePpa>
         <gen:numero>001399</gen:numero>
      	  <gen:ano>2021</gen:ano>
      </aux:numeroLeiCriaAltePpa>
   </aux:Programa>



<!--ACAO ================================================================================-->

   <aux:Acao>
      <aux:codigoAcao>1002</aux:codigoAcao>
      <aux:denominacaoAcao>Aquisição de Equipamentos Para Camara</aux:denominacaoAcao>
      <aux:tipoAcao>1</aux:tipoAcao>
   </aux:Acao>

   <aux:Acao>
      <aux:codigoAcao>1003</aux:codigoAcao>
      <aux:denominacaoAcao>Construção Predio Camara - Prosseguimento</aux:denominacaoAcao>
      <aux:tipoAcao>1</aux:tipoAcao>
   </aux:Acao>

   <aux:Acao>
      <aux:codigoAcao>1004</aux:codigoAcao>
      <aux:denominacaoAcao>Restauração Predio antigo Camara</aux:denominacaoAcao>
      <aux:tipoAcao>1</aux:tipoAcao>
   </aux:Acao>

   <aux:Acao>
      <aux:codigoAcao>2001</aux:codigoAcao>
      <aux:denominacaoAcao>Encargos c/Vereadores</aux:denominacaoAcao>
      <aux:tipoAcao>2</aux:tipoAcao>
   </aux:Acao>

   <aux:Acao>
      <aux:codigoAcao>2003</aux:codigoAcao>
      <aux:denominacaoAcao>Manutenção Administrativa da Camara</aux:denominacaoAcao>
      <aux:tipoAcao>2</aux:tipoAcao>
   </aux:Acao>

   <aux:Acao>
      <aux:codigoAcao>2004</aux:codigoAcao>
      <aux:denominacaoAcao>Encargos com Gabinete de vereadores</aux:denominacaoAcao>
      <aux:tipoAcao>2</aux:tipoAcao>
   </aux:Acao>


</aux:CadastrosAuxiliares>
E dá o seguinte erro:
LastKey..: 105

Erro Tipo: Error MSXML2.DOMDocument.6.0/3
Descrição: DISP_E_MEMBERNOTFOUND
Argumentos:
[ 1] = Tipo: "C" Valor: "//aux:UnidadeOrcamentaria";
Operação: SELECTNODES
Programa: C:\SimplesInfo\Scp21H\Scp21H.exe
Na função: TOLEAUTO:SELECTNODES
Na linha: 0

Sei que o Nodes estão todos precedidos por aux:, devido ao Schema a que eles pertence, mas não sei como fazer com que o método possa lê-los.

Desde já agradeço a ajuda.

Como ler um arquivo XML com CreateObject("MSXML2.DOMDocumen?

Enviado: 11 Nov 2024 13:03
por clodoaldomonteiro
Bom, deu certo usando TOLEAUTO():New( "Microsoft.XMLDOM" ) no lugar de CreateObject("MSXML2.DOMDocument.6.0").

Abraços

Como ler um arquivo XML com CreateObject("MSXML2.DOMDocumen?

Enviado: 11 Nov 2024 13:57
por JoséQuintas
No xharbour, esse CreateObject() é diferente conforme a biblioteca adotada, talvez até o TOleAuto() também.
Tipo no fivewin funciona e minigui não, ou vice-versa.
Nem pergunte detalhes, não uso xharbour, mas isso já foi problema pra quem queria usar SefazClass, e lembro de criarem até TOleAutoX(), pra subsituir numa das bibliotecas.

No harbour já vi dar problema misturar win_OleCreateObject() com TOleAuto(), mas geralmente o win_OleCreateObject() resolve tudo.
Mas também corre o risco de bibliotecas adicionarem versão diferente.

Cada um que faça os testes.
Tudo sofre atualizações, é testar com versão atual pra ver o que dá.

Lembro que o erro era exatamente esse de MEMBER NOT FOUND.
Algo como não detectar corretamente os métodos da classe.