Hola
Si estás seguro de que el número de lineas y el contenido nunca va a cambiar en ese archivo XML pues... entonces la solución que has pensado es viable, aunque no me parece la mejor solución, yo te recomendaría utilizar la aplicación XMLStarlet que sirve precísamente para la edición de archivos XML, aunque óbviamente deberás tratar el archivo como un archivo XML indicando el namespace el attributo a modificar y etc.
Por otro lado Batch es muy feo y lento, muy poco óptimo para estas tareas de procesamiento, te propongo una solución mejor utilizando VBS (El intérprete ya viene con Windows así que no tienes que instalar software en la empresa):
NOTA: Asegúrate de que la codificación de los archivos
XML sea
ANSI.
' El Objeto 'FileSystemObject'.
Set FSO = CreateObject("Scripting.FileSystemObject")
Directory = ".\" ' El directorio donde guardas los archivos.
FileExt = "xml" ' La extensión de los archivos a escanear.
LineToScan = 7 ' La linea para identificar el archivo.
TextToMatch = "Something" ' El texto que buscar en la linea a examinar.
LineToReplace = 22 ' El número de la linea a reemplazar.
TextToReplace = "<New Password>" ' El nuevo texto de la linea a reemplazar.
' Recorro los archivos del directorio 'Directory'.
For Each File In FSO.GetFolder(Directory).Files
' Si la extensión del archivo es igual que 'FileExt'...
If LCase(FSO.GetExtensionName(File)) = LCase(FileExt) Then
' Creo un Array con el contenido del archivo (las lineas de texto).
Lines = Split(FSO.OpenTextFile(File, 1).ReadAll(), vbcrlf)
' Si la cantidad de elementos del Array (lineas) es igual o mayor que 'LineToReplace';
' y si además el texto de la linea 'LineToScan' es igual a 'TextToMatch'...
If (uBound(Lines) => (LineToReplace -1)) And _
(LCase(Lines(LineToScan - 1)) = LCase(TextToMatch)) Then
' Reemplazo la linea 'LineToReplace' por el texto 'TextToReplace'.
Lines(LineToReplace -1) = TextToReplace
' Reemplazo el archivo original, con los cambios realizados.
FSO.CreateTextFile(File, 2).Write(Join(Lines, vbcrlf))
'' ...O Creo un nuevo documento en la misma carpeta del archivo original, con los cambios realizados.
' FSO.CreateTextFile(FSO.GetBaseName(File) & ".tmp", 2).Write(Join(Lines, vbcrlf))
' Detengo la iteración de los elementos, salgo del búcle.
Exit For ' // Each File In FSO.GetFolder(Directory).Files
End If ' // (uBound(Lines) => (LineToReplace -1)) And (LCase(Lines(LineToScan - 1)) = LCase(TextToMatch))
End If ' // LCase(FSO.GetExtensionName(File)) = LCase(FileExt)
Next ' // File
Wscript.Quit(0) ' Salisa exitosa: '0'
Modifícalo a tus necesidades,
Saludos!