Todo lo que mencionan es verdad, es un caso común sobre todo en sistemas adaptados a CFD donde sus BD no estaban pensadas para estas necesidades y donde era posible agregar caracteres que en ese momento no eran problemáticos.
Si utilizas la clase del foro, cada valor que le mandas a la clase que representa un nodo dentro de tu XML es 'reparodo' antes de formar parte del nodo.
Esta es la información de la función en la clase; las adaptaciones son del compañero Victor Espina
*-- _fixStr (Metodo)
* Recibe una cadena y realiza los siguientes cambios:
* a) Sustituye cualquier caracter invalido por el caracter "."
* b) Elimina los espacios en blanco al inicio y al final de la cadena
* c) Elimina cualquier secuencia de espacios en blanco repetidos dentro de la cadena
* d) Si la cadena resultante contiene al menos 1 caracter, se le anade la cadena
* indicada en el parametro pcSep
*
* La funcion fue reeacrita a partir de la funcion QtarChrInval() de Halcon Divino, a fin
* de simplificar el codigo y depurarlo. El metodo utilizado por Halcon Divino para incluir
* cada elemento en la cadena original implicaba una doble llamada a QtarChrInval() para
* cada valor en la cadena:
*
* cStr = cStr + Iif(Len(QtarChrInval(valor)) = 0, "" ,QtarChrInval(valor) + "|")
*
* Este codigo se simplifica y mejora haciendo una sola invocacion a fixStr:
*
* cStr = cStr + THIS._fixStr(valor, "|")
*
* Adicionalmente se incluyo codigo para permitir que la funcion reciba cualquier tipo
* de datos, haciendo la conversion adecuada segun el tipo. En los casos donde el parametro
* de entraada no sea un string, no se realiza la verificacion de caracteres invalidos
*
...
El código completo lo pueden ver en la clase que pueden descargar, la liga de descarga está en el primer post de este foro o del repositorio de github CFD-CFDI-con-VFP.