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 RUN
- /***********************************************************************************************************************/
/* 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 RUN
- <?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 RUN
- // 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