Recorrer un xml y según su tag enviarlo a una path especifico

Este es mi primer post llegue a este foro googleando, capaz me puedan ayudar y se los agradecería de verdad

Tengo que hacer un bat (estoy recién arrancando en esto y se lo básico de la sintaxis) que recorra un xml y un tag que esté dentro enviarlo a una ruta específica

@echo off
Setlocal enabledelayedexpansion
set PATH1=...XMLS
SET PATH2=...\AUTO
SET PATH3=...\CASA
SET PATH4=...\Departamento
SET PATH5=...\Edificio

for %%x in (%PATH1%\*.xml) do ( ('find /i "AUTO"')
copy %%x %PATHF1%\
)

Escribí “...” en la ruta así es más corto el código, es solo de ejemplo

En la ruta llamada “XML” están todos los XML que tendría que copiar en las distintas ves rutas según un tag que esté dentro (ese tag solo aparece una vez y no aparece en el resto de los xml, por ende lo puedo distinguir usándolo, creo)

¿Estoy bien encaninado? ¿Hay otra forma de hacerlo mejor?

1 respuesta

Respuesta
2

Entiendo que quieres recorrer todos los archivos de extensión XML que se encuentran en una carpeta, la situada en la ubicación a la que apunta la variable PATH1, y que cuando se encuentre en cualquier línea de cualquiera de ellos un literal ("AUTO", "CASA", "Departamento", "Edificio", etc.) se copie el archivo completo a una carpeta relacionada con el literal encontrado (variables PATH2, PATH3, PATH4 y PATH5). En tu ejemplo habría, entiendo, una errata y donde dice %PATHF1% debería decir %PATH2%. Y repetirías el comando FOR para cada uno de los literales, ¿no?

Si es esto lo que pretendes tu bat sería algo así:

@echo off
SET PATH1=...XMLS
SET PATH2=...\AUTO
SET PATH3=...\CASA
SET PATH4=...\Departamento
SET PATH5=...\Edificio
for %%x in ("%PATH1%\*.xml") do find /i "AUTO" "%%x">nul && copy "%%x" "%PATH2%\"
for %%x in ("%PATH1%\*.xml") do find /i "CASA" "%%x">nul && copy "%%x" "%PATH3%\"
for %%x in ("%PATH1%\*.xml") do find /i "Edificio" "%%x">nul && copy "%%x" "%PATH4%\"
for %%x in ("%PATH1%\*.xml") do find /i "Departamento" "%%x">nul && copy "%%x" "%PATH5%\"

He respetado tu criterio respecto a los ... y he añadido comillas para prevenir que en las rutas pueda haber espacios. El "truco" del "&&" hace que el comando que sigue se ejecute solo si el comando anterior tuvo éxito, es decir si provocó un ERRORLEVEL de valor cero. Para conseguir lo contrario se usaría "||". Esto no está muy documentado pero es bastante útil.

¡Gracias! 

Era justo lo que necesitaba y me estaba volviendo loco con la sintaxis (si, me había confundido y en vez de poner path2 puse path1)

Muchas gracias!!

Pues si no necesitas nada más, puedes cerrar la consulta.

Hola! Quiero volver a reabrir este post, porque tengo 2 consultas que no puedo resolver y me serviría de mucho su ayuda

1: Cuando copió “Departamento” a la ruta corrrespondiente, solo se tiene que copiar los XML que contengan 1 sola vez el tag “Departamento”  porque cada XML puede tener más de un tag “Departamento”

2- Necesito hacer un reemplazo dentro del xml, todos estos XML arrancan con “<?xml version="1.0" encoding="utf-16"?>” y necesito cambiarlos a todos por “ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> "

desde ya, muchas gracias 

Para el punto 1 puedes probar con:

@echo off
Setlocal EnableDelayedExpansion
SET PATH1=...XMLS
SET PATH2=...\AUTO
SET PATH3=...\CASA
SET PATH4=...\Departamento
SET PATH5=...\Edificio
for %%x in ("%PATH1%\*.xml") do find /i "AUTO" "%%x">nul && copy "%%x" "%PATH2%\"
for %%x in ("%PATH1%\*.xml") do find /i "CASA" "%%x">nul && copy "%%x" "%PATH3%\"
for %%x in ("%PATH1%\*.xml") do find /i "Edificio" "%%x">nul && copy "%%x" "%PATH5%\"
for %%x in ("%PATH1%\*.xml") do (
   for /f "tokens=* delims=" %%a in ('find /i /c "Departamento" "%%x"') do (
      set result=%%a
      set result=!result:~-2!
      set /a result=!result!
      if #!result!#==#1# copy "%%x" "%PATH4%\
      )
)

Con los mismos criterios que en la otra versión. Prueba y dime si te funciona correctamente.

El punto 2 me está costando más porque que las cadenas a sustituir y sustituidoras incluyan el carácter "=" dificulta la utilización de la forma más "sencilla". Seguiré intentándolo y ya te contaré si encuentro una forma.

Por cierto que hubiera sido más "limpio" abrir otra consulta porque se suponía que esta ya estaba cerrada. Eso permitiría calificar la otra pregunta aunque a lo mejor se puede volver a calificar esta. En todo caso no me importa demasiado la calificación que se dé a mis respuestas, pero algo... sí...

He preparado una solución para ambos puntos pero la utilizada para el punto 2 es un poco chapucera y solo sirve si todos los archivos XML de la carpeta origen empiezan EXACTAMENTE como dices, por "<?xml version="1.0" encoding="utf-16"?>". No he encontrado otra solución más elegante:

@echo off
Setlocal EnableDelayedExpansion
SET PATH1=...XMLS
SET PATH2=...\AUTO
SET PATH3=...\CASA
SET PATH4=...\Departamento
SET PATH5=...\Edificio
set cadena=?xml version="1.0" encoding="UTF-8" standalone="yes"?
for %%x in ("%PATH1%\*.xml") do (
   del /q "%PATH1%\temp.txt"
   set indicador=S
   for /f "tokens=* delims=" %%a in ('type "%%x"') do (
      set linea=%%a
      if not !indicador!==S echo !linea!>>"%PATH1%\temp.txt"
      if !indicador!==S echo ^<%cadena%^>!linea:~39!>>"%PATH1%\temp.txt"&set indicador=N
      )
   copy /y "%PATH1%\temp.txt" "%%x"
   )
for %%x in ("%PATH1%\*.xml") do find /i "AUTO" "%%x">nul && copy "%%x" "%PATH2%\"
for %%x in ("%PATH1%\*.xml") do find /i "CASA" "%%x">nul && copy "%%x" "%PATH3%\"
for %%x in ("%PATH1%\*.xml") do find /i "Edificio" "%%x">nul && copy "%%x" "%PATH5%\"
for %%x in ("%PATH1%\*.xml") do (
   for /f "tokens=* delims=" %%a in ('find /i /c "Departamento" "%%x"') do (
      set result=%%a
      set result=!result:~-2!
      set /a result=!result!
      if #!result!#==#1# copy "%%x" "%PATH4%\"
      )
)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas