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

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

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

Mensagem 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.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

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

Mensagem por clodoaldomonteiro »

Bom, deu certo usando TOLEAUTO():New( "Microsoft.XMLDOM" ) no lugar de CreateObject("MSXML2.DOMDocument.6.0").

Abraços
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder