Iterate over a list of IPv6 Addresse in a Bash Script for loop-Collection of common programming errors

Try using

file_"${X//:/_}".xml

in order to replace all : with _.

If your files are already named this way and this shouldn’t change,

file_"${X//:/\\:}".xml

can be used as well. But I’m not sure if scp does recognize this appropriately.

Besides that, the scp manpage contains

File names may contain a user and host specification to indicate that the file is to be copied to/from that host. Local file names can be made explicit using absolute or relative pathnames to avoid scp treating file names containing ‘:’ as host specifiers. Copies between two remote hosts are also permitted.

So just using ./file_"${X}".xml should work as well.