juan fco. vasquez Mendoza
Posts: 109 Joined: Fri May 09, 2008 8:19 pm
Post
by juan fco. vasquez Mendoza » Mon Apr 27, 2026 2:45 pm
Buenas, aquí tengo este formato para el ARCHIVO XML de mi país República Dominicana, para quien ya con sus experiencias pueda colaborar con ayuda.
agradecido siempre,
JFVM
Esquema Base de un e-CF XML
xml
<ECF xmlns="http://dgii.gov.do ">
<Encabezado>
<IdDoc>
<TipoeCF>31</TipoeCF> <!-- 31: Factura de Crédito Fiscal Electrónica -->
<eNCF>E310000000001</eNCF>
<FechaEmision>2026-04-26</FechaEmision>
</IdDoc>
<Emisor>
<RNCEmisor>101XXXXXX</RNCEmisor>
<RazonSocialEmisor>Nombre de tu Empresa</RazonSocialEmisor>
</Emisor>
<Receptor>
<RNCReceptor>130XXXXXX</RNCReceptor>
<RazonSocialReceptor>Nombre del Cliente</RazonSocialReceptor>
</Receptor>
<Totales>
<MontoTotal>1180.00</MontoTotal>
<MontoITBIS>180.00</MontoITBIS>
</Totales>
</Encabezado>
<DetallesItems>
<Item>
<IndicadorExentoITBIS>1</IndicadorExentoITBIS>
<NombreItem>Producto de Ejemplo</NombreItem>
<CantidadItem>1</CantidadItem>
<PrecioUnitarioItem>1000.00</PrecioUnitarioItem>
<MontoItem>1000.00</MontoItem>
</Item>
</DetallesItems>
<!-- La sección Signature es obligatoria y se genera tras firmar el XML -->
<Signature xmlns="http://w3.org ">
... (Bloque de firma digital) ...
</Signature>
</ECF>
karinha
Posts: 8720 Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Contact:
Post
by karinha » Mon Apr 27, 2026 6:22 pm
Mira este ejemplo simples se ayuda,
Code: Select all | Expand
// C:\FHW2603\SAMPLES\CREAXML2.PRG - Build 12 de FWH26.03
#include "FiveWin.ch"
#include "hbclass.ch"
#include "hbxml.ch"
#include "FileIO.ch"
FUNCTION Main() // WriteXML()
LOCAL hFile
hFile := FCreate( "ejemplo.xml" )
IF hFile != -1
FWrite( hFile, '<?xml version="1.0" encoding="UTF-8"?>' + HB_OsNewLine() )
FWrite( hFile, '<root>' + HB_OsNewLine() )
FWrite( hFile, ' <item id="1">Data</item>' + HB_OsNewLine() )
FWrite( hFile, '</root>' + HB_OsNewLine() )
FWrite( hFile, '<person dataSource="215" dataSourceNbr="215">' + HB_OsNewLine() )
FWrite( hFile, '<active>Y</active>' + HB_OsNewLine() )
FWrite( hFile, '<Item>' + HB_OsNewLine() )
FWrite( hFile, '<IndicadorExentoITBIS>1</IndicadorExentoITBIS>' + HB_OsNewLine() )
FWrite( hFile, '<NombreItem>Producto de Ejemplo</NombreItem>' + HB_OsNewLine() )
FWrite( hFile, '<CantidadItem>1</CantidadItem>' + HB_OsNewLine() )
FWrite( hFile, '<PrecioUnitarioItem>1000.00</PrecioUnitarioItem>' + HB_OsNewLine() )
FWrite( hFile, '<MontoItem>1000.00</MontoItem>' + HB_OsNewLine() )
FWrite( hFile, '</Item>' )
FClose( hFile )
ENDIF
RETURN NIL
Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
karinha
Posts: 8720 Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Contact:
Post
by karinha » Mon Apr 27, 2026 6:32 pm
Creo que solo funcione con HARBOUR. Con xHarbour, NO COMPILA.
Code: Select all | Expand
#include "FiveWin.ch"
#include "hbxml.ch"
Function Main()
Local oXmlWriter
Local cArquivo := "exemplo.xml"
Local cEmpresa := "Minha Empresa LTDA"
Local cCNPJ := "00.000.000/0001-00"
// 1. Criar o arquivo e iniciar o writer
oXmlWriter := TXmlWriter():New( cArquivo )
// 2. Iniciar o Documento XML (prologue)
oXmlWriter:Start( "1.0", "UTF-8" )
// 3. Abrir a tag raiz (root)
oXmlWriter:OpenTag( "cadastro" )
// 4. Adicionar elementos (tags)
oXmlWriter:Element( "nome_empresa", cEmpresa )
oXmlWriter:Element( "cnpj", cCNPJ )
// 5. Exemplo de estrutura aninhada (tags filhas)
oXmlWriter:OpenTag( "endereco" )
oXmlWriter:Element( "rua", "Rua das Flores, 123" )
oXmlWriter:Element( "cidade", "São Paulo" )
oXmlWriter:CloseTag( "endereco" )
// 6. Fechar a tag raiz
oXmlWriter:CloseTag( "cadastro" )
// 7. Finalizar e salvar
oXmlWriter:End()
oXmlWriter:Destroy()
MsgInfo( "XML gerado com sucesso: " + cArquivo )
Return Nil
Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Antonio Linares
Site Admin
Posts: 44515 Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:
Post
by Antonio Linares » Mon Apr 27, 2026 8:59 pm
Code: Select all | Expand
// TXmlWriter — minimal streaming XML writer for Harbour / xHarbour.
// Designed for the typical OpenTag / Element / CloseTag pattern. Writes
// directly to disk so it stays cheap on memory for large documents.
#include "FileIO.ch"
#define CRLF Chr(13)+Chr(10)
CLASS TXmlWriter
DATA cFile AS CHARACTER
DATA hFile AS NUMERIC INIT -1
DATA nIndent AS NUMERIC INIT 0
DATA cIndStr AS CHARACTER INIT " " // 2 spaces per level
DATA aStack AS ARRAY INIT {} // tag stack for nesting
DATA lOpen AS LOGICAL INIT .F.
METHOD New( cFile ) CONSTRUCTOR
METHOD Start( cVersion, cEncoding )
METHOD OpenTag( cTag, hAttribs )
METHOD CloseTag( cTag )
METHOD Element( cTag, cValue, hAttribs )
METHOD Comment( cText )
METHOD CData( cText )
METHOD End()
METHOD Destroy()
METHOD Write( cText ) PROTECTED
METHOD WriteIndent() PROTECTED
METHOD AttrStr( hAttribs ) PROTECTED
METHOD Escape( cText ) PROTECTED
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( cFile ) CLASS TXmlWriter
::cFile := cFile
::hFile := FCreate( cFile )
::lOpen := ( ::hFile != -1 )
::aStack := {}
::nIndent := 0
RETURN Self
//----------------------------------------------------------------------------//
METHOD Start( cVersion, cEncoding ) CLASS TXmlWriter
DEFAULT cVersion := "1.0"
DEFAULT cEncoding := "UTF-8"
::Write( '<?xml version="' + cVersion + '" encoding="' + cEncoding + '"?>' + CRLF )
RETURN Self
//----------------------------------------------------------------------------//
METHOD OpenTag( cTag, hAttribs ) CLASS TXmlWriter
::WriteIndent()
::Write( "<" + cTag + ::AttrStr( hAttribs ) + ">" + CRLF )
AAdd( ::aStack, cTag )
::nIndent++
RETURN Self
//----------------------------------------------------------------------------//
METHOD CloseTag( cTag ) CLASS TXmlWriter
LOCAL n
IF ::nIndent > 0
::nIndent--
ENDIF
IF Len( ::aStack ) > 0
n := Len( ::aStack )
DEFAULT cTag := ::aStack[ n ]
ASize( ::aStack, n - 1 )
ENDIF
::WriteIndent()
::Write( "</" + cTag + ">" + CRLF )
RETURN Self
//----------------------------------------------------------------------------//
METHOD Element( cTag, cValue, hAttribs ) CLASS TXmlWriter
DEFAULT cValue := ""
::WriteIndent()
IF Empty( cValue )
::Write( "<" + cTag + ::AttrStr( hAttribs ) + "/>" + CRLF )
ELSE
::Write( "<" + cTag + ::AttrStr( hAttribs ) + ">" + ;
::Escape( cValue ) + "</" + cTag + ">" + CRLF )
ENDIF
RETURN Self
//----------------------------------------------------------------------------//
METHOD Comment( cText ) CLASS TXmlWriter
::WriteIndent()
::Write( "<!-- " + cText + " -->" + CRLF )
RETURN Self
//----------------------------------------------------------------------------//
METHOD CData( cText ) CLASS TXmlWriter
::WriteIndent()
::Write( "<![CDATA[" + cText + "]]>" + CRLF )
RETURN Self
//----------------------------------------------------------------------------//
METHOD End() CLASS TXmlWriter
// Flush any remaining open tags so the file is well-formed even if the
// caller forgot to close them.
DO WHILE Len( ::aStack ) > 0
::CloseTag()
ENDDO
RETURN Self
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS TXmlWriter
IF ::lOpen
FClose( ::hFile )
::lOpen := .F.
::hFile := -1
ENDIF
RETURN Self
//----------------------------------------------------------------------------//
METHOD Write( cText ) CLASS TXmlWriter
IF ::lOpen
FWrite( ::hFile, cText )
ENDIF
RETURN NIL
//----------------------------------------------------------------------------//
METHOD WriteIndent() CLASS TXmlWriter
LOCAL i
FOR i := 1 TO ::nIndent
::Write( ::cIndStr )
NEXT
RETURN NIL
//----------------------------------------------------------------------------//
METHOD AttrStr( hAttribs ) CLASS TXmlWriter
LOCAL cOut := ""
LOCAL cKey
IF HB_ISHASH( hAttribs )
FOR EACH cKey IN hb_HKeys( hAttribs )
cOut += " " + cKey + '="' + ::Escape( cValToChar( hAttribs[ cKey ] ) ) + '"'
NEXT
ENDIF
RETURN cOut
//----------------------------------------------------------------------------//
METHOD Escape( cText ) CLASS TXmlWriter
cText := StrTran( cText, "&", "&" )
cText := StrTran( cText, "<", "<" )
cText := StrTran( cText, ">", ">" )
cText := StrTran( cText, '"', """ )
cText := StrTran( cText, "'", "'" )
RETURN cText