[AYUDA-BATCH]Cambiar datos de archivos .xml

Iniciado por FranciskoAsdf, 19 Junio 2009, 03:58 AM

0 Miembros y 1 Visitante están viendo este tema.

FranciskoAsdf

Hola de nuevo a todos, espero que esten bien ^^*

bueno aca estoy tratando de hacer un bat que me ayude con unos archivos que necesitos editar..

a ver voy a a tratar de explicarme lo mejor posible

yo trabajo con varios archivos .xml que contienen un contenido (valga la redundancia ) como el siguiente

<?xml version="1.0" encoding="UTF-8"?>
<list>
<skill id="301" levels="5" name="Summon Big Boom" enchantLevels1="30">
 <table name="#enchantNpcIds"> 14707 14708 14709 14710 14711 14712 14713 14714 14715 14716 14717 14718 14719 14720 14721 14722 14723 14724 14725 14726 14727 14728 14729 14730 14731 14732 14733 14734 14735 14736 </table>
 <enchant1 name="npcId" val="#enchantNpcIds"/>
 <table name="#mpConsume"> 74 82 88 94 100 </table>
 <table name="#itemConsumeCount"> 3 3 4 4 5 </table>
 <set name="mpConsume" val="#mpConsume"/>
 <set name="itemConsumeId" val="1458"/>
 <set name="itemConsumeCount" val="#itemConsumeCount"/>
 <set name="itemConsumeIdOT" val="1458"/>
 <set name="itemConsumeCountOT" val="5"/>
 <set name="itemConsumeSteps" val="4"/>
 <set name="summonTotalLifeTime" val="1200000"/>
 <set name="summonTimeLostIdle" val="500"/>
 <set name="summonTimeLostActive" val="1000"/>
 <set name="target" val="TARGET_SELF"/>
 <set name="reuseDelay" val="5000"/>
 <set name="hitTime" val="6000"/>
 <set name="skillType" val="SUMMON"/>
 <set name="isMagic" val="true"/>
 <set name="operateType" val="OP_ACTIVE"/>
 <!-- Summon-specific -->
 <table name="#npcIds"> 14702 14703 14704 14705 14706 </table>
 <set name="npcId" val="#npcIds"/>
 <set name="expPenalty" val="0.3"/> <!-- 30 percent of acquired Exp will be consumed. -->
 <table name="#ench1expPenalty"> 0.28 0.26 0.24 0.22 0.20 0.18 0.16 0.14 0.12 0.10 0.08 0.06 0.04 0.02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </table>
 <enchant1 name="expPenalty" val="#ench1expPenalty"/>
</skill>
<skill id="302" levels="9" name="Spoil Festival" enchantLevels1="30" enchantLevels2="30">
 <table name="#enchantMagicLvl"> 76 76 76 77 77 77 78 78 78 79 79 79 80 80 80 81 81 81 82 82 82 82 83 83 83 84 84 85 85 85 </table>
 <enchant1 name="magicLvl" val="#enchantMagicLvl"/>
 <enchant2 name="magicLvl" val="#enchantMagicLvl"/>
 <table name="#magicLvl"> 28 36 43 49 55 62 66 70 74 </table>
 <table name="#mpConsume"> 73 93 113 131 150 172 183 194 204 </table>
 <table name="#ench12Power"> 0 1 2 2 3 4 4 5 6 6 7 8 8 9 10 10 11 12 12 13 14 14 15 16 16 17 18 18 19 20 </table>
 <set name="mpConsume" val="#mpConsume"/>
 <set name="magicLvl" val="#magicLvl"/>
 <set name="target" val="TARGET_AREA"/>
 <set name="skillRadius" val="200"/>
 <set name="reuseDelay" val="3000"/>
 <set name="hitTime" val="1800"/>
 <set name="lvlDepend" val="1"/>
 <set name="skillType" val="SPOIL"/>
 <set name="operateType" val="OP_ACTIVE"/>
 <set name="isDebuff" val="true"/>
 <set name="castRange" val="40"/>
 <set name="effectRange" val="400"/>
 <enchant1 name="power" val="#ench12Power"/>
 <enchant2 name="power" val="#ench12Power"/>
 <for>
   <effect name="Spoil" val="0"/>
 </for>
 <enchant1for>
   <effect name="Debuff" time="15" val="0" stackOrder="23" stackType="attack_time_up">
     <mul order="0x30" stat="pAtkSpd" val="0.77"/>
   </effect>
 </enchant1for>
 <enchant2for>
   <!-- Retail Values CT2.3: 118HP * 3 Sec -->
   <effect count="5" name="DamOverTime" time="3" val="354"/>
 </enchant2for>
</skill>
</list>

los archivos son mucho mas largos, osea su contenido, solo coloque una porcion del mismo para no hacer tan largo el post...
en fin lo que quiero hacer es lo siguiente, yo necesito editar una linea de cada mmmmm a ver como llamarlo..."SKILL"
llamese "SKILL" al contenido que esta dentro de <skill> y </skill> , por ejemplo la linea que necesito editar es la siguiente
 <set name="target" val="TARGET_AREA"/>
y lo que necesito cambiar de esa linea es la frase "TARGET_AREA", por lo que io le diga (al code xD)
por ejemplo

"TARGET_AREA"
por
"TARGET_PARTY"

(obviamente sin las comillas ^^)
pero nose como hacerlo para no cambiar el demas contenido del los archivos...
a todo esto los archivos esta nombrados de la siguiente forma dentro de la carpeta
por ejemplo

10001-10025.xml
10369-20558.xml

y asi (son varios archivos).
Pero obviamente nose como hacerlo, es por eso que les pido su ayuda, da lo mismo en que lenguaje sea, lo ideal seria batch porke es de lo que entiendo mas (aunque no lo crean :xD), es que io creo que debe ser con un FOR pero no son mi fuerte :xD!!

Esperando que me puedan ayudar se despide atte

Francisko

SAludos y mucha gracias de ante mano
Asdf debería ser algún tipo de función.

leogtz

#1
El siguiente Script que hice, busca en "file.txt" (Esto tu lo cambias a tu conveniencia) la cadena :
target_area
Y edita la linea por la cadena "Leo Gutierrez" (Esto tu lo editas a tu conveniencia).
Código (dos) [Seleccionar]

@echo off
:: Leo Gutierrez R.
:: Editar la linea con la coincidencia :
:: <set name="target" val="TARGET_AREA"/>
for /f "tokens=1 delims=[]" %%_ in ('type "file.txt" ^| find /i /n "target_area"') do call:edicion %%_
goto:eof
:edicion
:: "Leo Gutierrez" es el valor que pondré.
(
echo %1
echo ^^^<set name="target" val="Leo Gutierrez"/^^^>
echo w
echo e
) | edlin /b file.txt
goto:eof


Ejecución:

C:\>type file.txt | find /i /n "target_area"
[39]  <set name="target" val="TARGET_AREA"/>

Vemos que la coincidencia esta en la línea 39.

Ejecuto el batch:
C:\>este.bat
Final del archivo de entrada
*39
     39:*  <set name="target" val="TARGET_AREA"/>
     39:*<set name="target" val="Leo Gutierrez"/>
*w
*e

Vemos como es editado el valor.

C:\>type "file.txt" | find /i /n "Leo Gutierrez"
[39]<set name="target" val="Leo Gutierrez"/>

C:\>

Por ultimo, busco en "file.txt" la cadena "Leo Gutierrez", y nos muestra la coincidencia y su linea.

Si quieres evitar que se muestre esto:
Final del archivo de entrada
*39
     39:*  <set name="target" val="TARGET_AREA"/>
     39:*<set name="target" val="Leo Gutierrez"/>
*w
*e


Agrega al código:
) | edlin /b file.txt > nul 2>&1



Para estos casos, valdría la pena echarle un vistazo a PERL.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

FranciskoAsdf

muchisimas gracias por tu respuesta, como siempre ayudando a los que sabemos menos , voy a probarlo a ver si me funiona ;D y posteo como me fue :D!, disculpapor la demora en responder, no tengo internet en la casa yu posteo desde cybers ^^

saludos y muchas gracias de nuevo :D
Asdf debería ser algún tipo de función.

FranciskoAsdf

#3
Leo Guitierrez, probé tu code y funciona super bien cuando el archivo a editar se llama "file.txt", obviamente
le cambie el nombre a 1111-1222.xml para que procesara la informacion con ese nombre de archivo (porque los archivos estan nombrados de esa forma) y me aparece el siguiente error


lo probé solo cambiando la extension a FILE.XML y tampoko hay problema, ahora como todos los archivos tienen nombres con numero
es ahi cuando me da el error de "ENTRY ERROR", pero nose porke :S y me corta el nombre del archivo de
1111-1222.xml a 1111-122.xml y dentro del fichero coloca el siguiente caracter "" (sin las comillas) incluso se le coloco como nombre 1111-1222.txt y tambien pasa lo de que acorta el nombre del archivo y solo genera el caracter anterior. Igual lo que io estoy intentando hacer es algo como lo siguiente:

Necesito cambiarle la frase "TARGET_PARTY" a los archivos  que io le diga =) y no a todos por igual porque o si no quedaria una embarrada del porte de un buque y el programa que me carga esos archivos me daria mil y un errores =(.

por ejemplo:

suponiendo que estoy trabajando en la carpeta original y estan todos los archivos, como puedo hacer para YO decirle
al programa que archivos procesar y que parte de esos archivos procesar?
por ejemplo:
tengo el archivo

1200-1299.xml

que contiene el siguiente nombre de skill (llamese skill al contenido que esta dentro de <skill> y </skill>)

<skill id="1242" levels="3" name="Wind Walk" enchantLevels1="30" enchantLevels2="30">

entonces yo decirle que solo procese la parte del archivo que tiene el nombre "Wind Walk" y que solo a ese contenido le cambie lo que te pedia en el post principal?,

estuve tratando de usar el siguiente condigo para buscar el nombre de skill que quiero editar y asi que me diga el nombre del archivo que necesito para pasarcelo al code que me diste tu, pero me muestra todas las coincidencias para por ejemplo "Wind Walk"

SET /P buscar="ID Nombre de skill a editar: "
findstr /I /M /C:"%buscar%" *.xml >> salida.txt

y me muestra en el archivo salida.txt lo siguiente:

1100-1199.xml
1200-1299.xml
1300-1399.xml
2000-2099.xml
21000-21099.xml
22000-22099.xml
2300-2399.xml
23000-23099.xml
2400-2499.xml
26000-26099.xml
2800-2899.xml
4200-4299.xml
4300-4399.xml
4400-4499.xml
5100-5199.xml
5200-5299.xml
5600-5699.xml
7000-7099.xml
8952-9911.xml

pero es solo el archivo 1200-1299.xml el que contiene el nombre "Wind Walk", y nose como hacer para que me muestre solo las coincidencias para "Wind Walk" y solo ese, y asi yo pasarle ese archivo al FOR que me diste tu y que en ese for solo se edite lo que necesito, pero solo donde esta esa palabra y NO en todo el archivo.


muchas gracias por tu ayuda, espero que me puedas ayudar u orientar por lo menos...

saludos y que esten bien ^^*!
Asdf debería ser algún tipo de función.

leogtz

He descubierto que EDLIN solo procesa nombres de archivos de 8 caracteres, sin contar la extensión.

He ahí el problema.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

FranciskoAsdf

u.u

bueno voy a ver como puedo hacerlo, de todas maneras muchas gracias por la ayuda
Asdf debería ser algún tipo de función.

leogtz

Mira, podrías pedir al usuario el archivo, y luego trabajar con un archivo .xml temporal, cuando termine la edición, lo renombras al archivo original pedido.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

FranciskoAsdf

voy a interntarlo asi muchas gracias leo saludos ^^
Asdf debería ser algún tipo de función.

netneko

alguien sabe como hago para agregarle un tag al principio y al final de un archivo XML?
<Datos>
el XML q ya esta
</Datos>

:)

leogtz

Cita de: netnetko en 12 Enero 2012, 20:27 PM
alguien sabe como hago para agregarle un tag al principio y al final de un archivo XML?
<Datos>
el XML q ya esta
</Datos>

:)

El tema que reabriste es del 2009, lee las reglas, va en contra de ellas abrir temas viejos.

Si quieres que se te ayude abre un nuevo tema con tu duda.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com