Modificar un fichero XML

Modificar un fichero XML

Postby Baxajaun » Wed Nov 18, 2015 11:32 am

Buenos días,

aquí os dejo un pequeño programilla que con la ayuda de muchos compañeros del foro he escrito para modificar un fichero XML.

Seguro que cualquiera de vosotros lo puede mejorar.

Código fuente Accipiter.prg
--------------------------------

Code: Select all  Expand view
/***********************************************************************************************************************/
/* Proyecto    : Accipiter                                                                                             */
/* Programa    : Accipiter.prg                                                                                         */
/* Programador : Félix Pablo Grande Ramos                                                                              */
/* Objetivo    : Modificar el fichero xml de configuración de la aplicación BOM                                        */
/* Fecha       : 5 Noviembre 2015                                                                                      */
/* Gracias a Antonio Linares, Cristobal Navarro, Rafa Carmona, Carlos Mora y otros muchos por ayudarme                 */
/* desinteresadamente ...                                                                                              */
/***********************************************************************************************************************/

#include "Fivewin.ch"
#include "directry.ch"
#include "hbxml.ch"

#define FECHAHORA   DTOS(DATE()) + CharRem(":",TIME())
#define DIRECTORIO "C:\MTC_DISENOS_\config\"
#define FICHERO "
Conexion_BOM.xml"
#define SERVER "
RHJpdmVyPU15U1FMIE9EQkMgNS4xIERyaXZlcjtTZXJ2ZXI9MTcyLjE2LjYwLjYwO0RhdGFiYXNlPTtVaWQ9dXN1YXJpbztQd2Q9UVdFcnR5MTIl"
#define LOCAL  "
alf"

STATIC oDlg, oFont, oIcon, oLogo, oImagen, oRadio
STATIC nOption // := 1  // Por defecto marca Local

FUNCTION Main()
hb_gcAll()  // Recolector de basura de Harbour
MemoryFlush()
SET EPOCH TO 2000
SET DATE FORMAT TO "
DD/MM/YYYY"
SET _3DLOOK ON
SetBalloon( .T. )
CheckStatus()
// Si existe el fichero C:\MTC_DISENOS_\config\output.xml lo borramos
IF FILE(DIRECTORIO+"
output.xml")
   FERASE(DIRECTORIO+"
output.xml")
ENDIF  

DEFINE FONT oFont NAME "
ARIAL" SIZE 0,-14
DEFINE ICON oIcon RESOURCE "
ACCIPITER"
DEFINE DIALOG oDlg RESOURCE "
ACCIPITER" ; //SIZE 903,351 PIXEL ;
      TITLE "
Accipiter" ;
      STYLE WS_POPUP ;
      FONT oFont ;
      ICON oIcon TRANSPARENT;     
   
      REDEFINE BITMAP oLogo ID 100 OF oDlg RESOURCE "
MTC" TRANSPARENT
      REDEFINE BITMAP oImagen ID 200 OF oDlg RESOURCE "
ACCIPITER" TRANSPARENT
     
      REDEFINE RADIO oRadio VAR nOption ID 300, 400 OF oDlg ;
      ON CHANGE ChangeXML()

      REDEFINE BUTTON ID 500 OF oDlg ACTION Salir()
   
ACTIVATE DIALOG oDlg CENTER ON INIT ( oDlg:lHelpIcon := .f.);

hb_gcAll()  // Recolector de basura de Harbour
 
MemoryFlush()

RETURN NIL

FUNCTION CheckStatus()
Local hFile    := FOpen( DIRECTORIO+FICHERO )
Local oXmlDoc  := TXmlDocument():New( hFile ), oNodo
Local oXmlIter := TXmlIteratorScan():New( oXmlDoc:oRoot ), oTagActual
Local nContador := 0
// Leemos el fichero xml

IF !FILE( DIRECTORIO+FICHERO )
    MsgStop("
No existe el fichero de configuración: "+DIRECTORIO+FICHERO, "Alto" )
    CleanResource()
    RETURN NIL
ENDIF

IF oXmlDoc:nStatus != HBXML_STATUS_OK
    Msginfo("
Error leyendo fichero XML ")    
    CleanResource()
    RETURN NIL
ELSE
    // Iniciamos proceso de tratamiento del fichero XML
    oTagActual := oXmlIter:Find( "
Data" )
    nContador := 1
    DO WHILE oTagActual != NIL .AND. nContador <= 2
        IF nContador = 2
           oNodo := oXmlIter:GetNode()
           IF oTagActual:cData == SERVER
              nOption := 2
           ELSE
              nOption := 1
           ENDIF
        ENDIF
        nContador++
        oTagActual = oXmlIter:Next()
    ENDDO   
ENDIF
FClose( hFile )
RETURN nOption

FUNCTION ChangeXML()
Local hFile    := FOpen( DIRECTORIO+FICHERO )
Local oXmlDoc  := TXmlDocument():New( hFile ), oNodo
Local oXmlIter := TXmlIteratorScan():New( oXmlDoc:oRoot ), oTagActual
Local nContador := 0 // Contador para modificar el string en el fichero xml
Local sWorkDir := cFilePath( GetModuleFileName( GetInstance( ) ) )  // Capturamos el directorio actual se podría utilizar hb_dirbase() también

// Leemos el fichero xml

IF !FILE( DIRECTORIO+FICHERO )
    MsgStop("
No existe el fichero de configuración: "+DIRECTORIO+FICHERO, "Alto" )
    CleanResource()
    RETURN NIL
ENDIF
// Si no existe el directorio "
Backup" lo creamos. Contendrá copia del fichero xml de configuración
IF !FILE("
Backup")
    MAKEDIR("
Backup")
ENDIF     

IF oXmlDoc:nStatus != HBXML_STATUS_OK
    Msginfo("
Error leyendo fichero XML ")    
    CleanResource()
    RETURN NIL
ELSE
    // Hacemos una copia de seguridad del fichero de configuración y lo copiamos en el directorio "
Backup" con la fecha y hora en su nombre
    XHB_COPYFILE( DIRECTORIO+FICHERO, "
./Backup/"+FICHERO+"."+FECHAHORA, {| x | QOut( x ) } )
    // Iniciamos proceso de tratamiento del fichero XML
    oTagActual := oXmlIter:Find( "
Data" )
    nContador := 1
    DO WHILE oTagActual != NIL .AND. nContador <= 2
        IF nContador = 2
           oNodo := oXmlIter:GetNode()
           IF nOption = 1
              oTagActual:cData:= LOCAL
             
           ELSE
              oTagActual:cData:=SERVER
             
           ENDIF
           oNodo:write(hFile)
        ENDIF
        nContador++
        oTagActual = oXmlIter:Next()
    ENDDO   
ENDIF
FClose( hFile )
hFile := FCreate( DIRECTORIO+"
output.xml" )
oXmlDoc:Write(hFile)
FClose( hFile )
FERASE(DIRECTORIO+FICHERO)
FRENAME(DIRECTORIO+"
output.xml",DIRECTORIO+FICHERO)

RETURN NIL

FUNCTION Salir()

   IF MsgYesNo ( "
Estas seguro de querer salir ?", "¡¡¡ Atención !!!" )
        CleanResource()
   Endif
RETURN NIL  

FUNCTION MemoryFlush
    SetProcess( -1, -1, -1)
RETURN NIL

FUNCTION CleanResource()
oDlg:End()
RELEASE BITMAP oLogo, oImagen
RELEASE FONT  oFont
RELEASE ICON oIcon
RELEASE RADIO oRadio
hb_gcAll()
Memory( -1 )
SET RESOURCES TO
FreeResources()
MemoryFlush()
RETURN NIL

DLL32 Function SetProcess( ;
   hWnd As LONG, nMinWorkingSpace As LONG, nMaxWorkingSpace As LONG ) ;
   As LONG PASCAL From "
SetProcessWorkingSetSize" Lib "Kernel32.dll"


Fichero Configuracion_BOM.xml
-------------------------------------
Code: Select all  Expand view
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Author>eneko</Author>
  <LastAuthor>aruiz</LastAuthor>
  <Created>2008-03-03T15:35:17Z</Created>
  <LastSaved>2014-01-02T17:50:35Z</LastSaved>
  <Company>icm</Company>
  <Version>14.00</Version>
 </DocumentProperties>
 <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  <RelyOnVML/>
  <AllowPNG/>
 </OfficeDocumentSettings>
 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>6390</WindowHeight>
  <WindowWidth>19170</WindowWidth>
  <WindowTopX>-15</WindowTopX>
  <WindowTopY>-15</WindowTopY>
  <TabRatio>862</TabRatio>
  <RefModeR1C1/>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font ss:FontName="Arial"/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
  <Style ss:ID="s62" ss:Name="Hipervínculo">
   <Font ss:FontName="Arial" ss:Color="#0000FF" ss:Underline="Single"/>
  </Style>
  <Style ss:ID="s63">
   <Interior ss:Color="#FFFF00" ss:Pattern="Solid"/>
  </Style>
  <Style ss:ID="s64">
   <Font ss:FontName="Arial" x:Family="Swiss" ss:Color="#FF0000" ss:Bold="1"/>
   <Interior ss:Color="#FFFF00" ss:Pattern="Solid"/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Configuracion">
  <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="23" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="60">
   <Column ss:AutoFitWidth="0" ss:Width="179.25"/>
   <Column ss:AutoFitWidth="0" ss:Width="435.75"/>
   <Row>
    <Cell><Data ss:Type="String">Cadena de conexión MySQL Central</Data></Cell>
    <Cell><Data ss:Type="String">RHJpdmVyPU15U1FMIE9EQkMgNS4xIERyaXZlcjtTZXJ2ZXI9bG9jYWxob3N0O0RhdGFiYXNlPTtVaWQ9cm9vdDtQd2Q9bWF0cmljaQ==</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Cadena de conexión ERP</Data></Cell>
    <Cell><Data ss:Type="String">UHJvdmlkZXI9T3JhT0xFREIuT3JhY2xlO0RhdGEgU291cmNlPUJBQU5MTjtVc2VyIElkPUJBQU47UGFzc3dvcmQ9QkFBTg==</Data></Cell>
   </Row>
   <Row>
    <Cell ss:StyleID="s63"><Data ss:Type="String">Compañia</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="Number">100</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Nodo ERP</Data></Cell>
    <Cell><Data ss:Type="String">localhost</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Comando ERP</Data></Cell>
    <Cell><Data ss:Type="String">CargaBOM.exe</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Path comando ERP</Data></Cell>
    <Cell ss:StyleID="s62" ss:HRef="C:\empresa\EMP_DISENOS_\config"><Data
      ss:Type="String">C:\empresa\EMP_DISENOS_</Data></Cell>
   </Row>
   <Row ss:Index="21">
    <Cell ss:Index="2"><Data ss:Type="String">Driver=MySQL ODBC 5.1 Driver;Server=localhost;Database=;Uid=root;Pwd=contrasena</Data></Cell>
    <Cell><Data ss:Type="String">RHJpdmVyPU15U1FMIE9EQkMgNS4xIERyaXZlcjtTZXJ2ZXI9bG9jYWxob3N0O0RhdGFiYXNlPTtVaWQ9cm9vdDtQd2Q9bWF0cmljaQ==</Data></Cell>
   </Row>
   <Row ss:Index="23">
    <Cell ss:Index="2"><Data ss:Type="String">Driver=MySQL ODBC 5.1 Driver;Server=172.16.60.60;Database=;Uid=usuario;Pwd=contrasena</Data></Cell>
    <Cell><Data ss:Type="String">RHJpdmVyPU15U1FMIE9EQkMgNS4xIERyaXZlcjtTZXJ2ZXI9MTcyLjE2LjYwLjYwO0RhdGFiYXNlPTtVaWQ9dXN1YXJpbztQd2Q9UVdFcnR5MTIl</Data></Cell>
   </Row>
  </Table>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <PageSetup>
    <Header x:Margin="0"/>
    <Footer x:Margin="0"/>
    <PageMargins x:Bottom="0.984251969" x:Left="0.78740157499999996"
     x:Right="0.78740157499999996" x:Top="0.984251969"/>
   </PageSetup>
   <Print>
    <ValidPrinterInfo/>
    <PaperSizeIndex>9</PaperSizeIndex>
    <HorizontalResolution>600</HorizontalResolution>
    <VerticalResolution>600</VerticalResolution>
   </Print>
   <Selected/>
   <Panes>
    <Pane>
     <Number>3</Number>
     <ActiveRow>29</ActiveRow>
     <ActiveCol>1</ActiveCol>
    </Pane>
   </Panes>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
</Workbook>
 


Fichero Accipiter.rc
-----------------------

Code: Select all  Expand view
// Generated by ResEdit 1.6.6
// Copyright (C) 2006-2015
// http://www.resedit.net

#include "C:\Develop\Borland\bcc7\include\windows\sdk\windows.h"
#include "C:\Develop\Borland\bcc7\include\windows\sdk\commctrl.h"
#include "C:\Develop\Borland\bcc7\include\windows\sdk\richedit.h"
#include "resource.h"




//
// Bitmap resources
//
LANGUAGE 0, SUBLANG_NEUTRAL
ACCIPITER          BITMAP         "bitmap7.bmp"


LANGUAGE 0, SUBLANG_NEUTRAL
MTC                BITMAP         "bitmap8.bmp"



//
// Dialog resources
//
LANGUAGE 0, SUBLANG_NEUTRAL
ACCIPITER DIALOG 0, 0, 362, 189
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP
CAPTION "Dialog"
FONT 8, "Ms Shell Dlg"
{
    CONTROL         "", 100, WC_STATIC, SS_BLACKFRAME, 15, 16, 48, 42, WS_EX_LEFT
    CONTROL         "", 200, WC_STATIC, SS_BLACKFRAME, 298, 16, 48, 42, WS_EX_LEFT
    AUTORADIOBUTTON "Local", 300, 172, 96, 50, 8, 0, WS_EX_LEFT
    AUTORADIOBUTTON "Servidor", 400, 172, 117, 60, 8, 0, WS_EX_LEFT
    PUSHBUTTON      "Salir", 500, 280, 155, 50, 14, 0, WS_EX_LEFT
}



//
// Icon resources
//
LANGUAGE 0, SUBLANG_NEUTRAL
ACCIPITER          ICON           "icon4.ico"
 


Nuevamente dar las gracias a todos los integrantes de este foro por prestar su tiempo y ayuda.

Muchas gracias.

Saludos
User avatar
Baxajaun
 
Posts: 968
Joined: Wed Oct 19, 2005 2:17 pm
Location: Gatika. Bizkaia

Re: Modificar un fichero XML

Postby Antonio Linares » Wed Nov 18, 2015 11:58 am

Muchas gracias Felix! :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42077
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Modificar un fichero XML

Postby horacio » Wed Nov 18, 2015 3:43 pm

Muchísimas gracias por el aporte !!!

Saludos
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Modificar un fichero XML

Postby Armando » Wed Nov 18, 2015 5:03 pm

Félix:

Es algo que muchos estábamos esperando.

Muchas gracias
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3209
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Modificar un fichero XML

Postby Baxajaun » Thu Nov 19, 2015 6:39 am

Buenos días,

si cualquiera de vosotros lo mejoráis, por favor dejad las modificaciones en el foro y así ganamos todos.

Muchas gracias.

Saludos
User avatar
Baxajaun
 
Posts: 968
Joined: Wed Oct 19, 2005 2:17 pm
Location: Gatika. Bizkaia


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 92 guests