2010-02-06 12 views
5

Tengo una clase con un miembro "Dirección" que leo de un archivo XML que tiene el siguiente formato (dirección falsa - El nombre de campo XML es "Dirección" - no se muestra):Leer cadena xml en cuadro de texto con nueva línea

106-1190 Media Luna San \ r \ n Toronto Ontario \ r \ n V2K 2Z6

he creado una de varias líneas de cuadro de texto para mostrar en un formulario con la propiedad se establece en true-retorno Acepta.

El cuadro de texto muestra lo siguiente con los caracteres de nueva línea de trabajo no

106-1190 Media Luna San \ r \ n Toronto Ontario \ r \ n V2K 2Z6

He mirado en línea para diversas soluciones y he intentado el siguiente:

1) \ n y \\ n

2) \\ r \\ n

Funciona si añado a la propiedad directa de este modo:

Address.Text = "106-1190 Crescent St.\r\nToronto Ont\r\nV2K 2Z6"; 

Pero si me carga una variable de cadena de un archivo XML y trato de asignarlo a la propiedad de texto:

Address.Text = Employee.Address; 

lo hace no trabajo.

puse puntos de vigilancia para comprobar la diferencia entre la asignación directa y la asignación de la variable ANG tiene esta diferencia:

directa: 106-1190 Media Luna San \ r \ n Toronto Ontario \ r \ n V2K 2Z6

variable: 106-1.190 Media Luna St. \\ r \\ n Toronto Ont \\ r \\ n V2K 2Z6

así en alguna parte del código está cambiando la barra invertida a una doble barra invertida en la conversión de la cadena XML a la variable.

Realmente no quiero tener que analizar mis cadenas XML para eliminar la barra adicional ... ¿Cómo puedo representar mis datos de cadena en un archivo XML de modo que se convierta en una variable de cadena adecuada con solo la barra única, para que mis saltos de línea aparezcan correctamente.

Gracias de antemano.

+0

Pruebe diferentes combinaciones de las funciones escape() y unescape() para limpiar los datos ... Piense en esto desde la perspectiva de "¿y si quería que '\ n' apareciera como un '\' real? y 'n' en el cuadro de texto, entonces ¿qué haría para que no aparezca de esa manera? –

Respuesta

6

El control de cuadro de texto no interpreta escapes y XML tampoco. así que esto es solo los personajes \ r y n. Necesita procesar la cadena, sustituyendo la cadena @ "\ r \ n" por "\ r \ n".

Address.Text = Employee.Address.Replace(@"\r\n", "\r\n"); 

esto es el equivalente a esta

Address.Text = Employee.Address.Replace("\\r\\n", "\r\n"); 

porque @ previene la interpretación de \ en la cadena.

editar: basado en un comentario, esta forma es aún mejor, se traduce en \ n en Unix, y \ r \ n en Windows.

Address.Text = Employee.Address.Replace("\\r\\n", Environment.NewLine); 
+0

+1 - una solución mejor que las otras respuestas publicadas. Es posible que desee reemplazar las secuencias "\ r \ n" con el entorno .Newline en lugar de "\ r \ n" (Nota: algunos controles no funcionan con Environment.Newline y requieren un \ r \ n explícito, pero no puedo recordarlo de inmediato si Textboxes es uno de los que se equivoca) –

+0

@Jason: La clase Windows Edit requiere \ r \ n y no solo \ n. Esta es una buena mejora. –

+0

Gracias por la respuesta: Usé Address.Text = Employee.Address.Replace ("\\ r \\ n "," \ r \ n "); para leer la cadena XML y Employee.ChangeAddress (Address.Text.Replace ("\ r \ n", "\\ r \\ n")); para volver a escribirlo, de lo contrario, el archivo XML usa las nuevas líneas al momento de la creación y pone nuevas líneas en mi XML que se ve mal. – Greycrow

3

Cuando dice "\n" en el código fuente, el compilador convierte el \n a una nueva línea, pero cuando se lee el código XML que presentamos lo mejor de los dos personajes distintos \ y n. Estos no son tratados por el compilador, por lo que no se convertirán en una nueva línea. En su lugar, se representará en una cadena como "\\n", es decir, una barra inversa escapada seguida de n.

La forma más sencilla de solucionarlo es probablemente reemplazar los caracteres antes de mostrarlos.

Address.Text = Employee.Address.Replace("\\r", "\r").Replace("\\n", "\n"); 

La mejor manera sería asegurarse de que los datos XML generados no contengan las secuencias de escape.Estos no son parte de XML, y deberían ser saltos de línea normales.

0

106-1190 Media Luna San \ r \ n Toronto Ontario \ r \ n V2K 2Z6

Creo que cambia cuando se lee desde el campo XML. Verifique eso o intente después de leer para reemplazar el valor de cadena dos barras invertidas en una barra invertida.

1

Debe utilizar raw strings, y luego se puede escribir @"106-1190 Crescent St.\r\nToronto Ont\r\nV2K 2Z6". Esto provoca que el literal de cadena se procese sin ninguna interpretación específica de idioma, por lo que "\n" permanece en "\n".

Del mismo modo, para asignar una cadena de texto de una variable, utilice:

Address.Text = @Employee.Address; 

Editar: También estoy de acuerdo con aquellos que dijeron que llamar String.Replace("\\r\\n", Environment.NewLine);. Esta es una solución más independiente de la plataforma que reemplazarla con "\r\n", y métodos como Console.WriteLine() anexan Environment.NewLine de todos modos en lugar de un "\n" codificado, por ejemplo. Ver MSDN's writeup on Environment.NewLine.

Cuestiones relacionadas