使用换行符将xml字符串读入文本框

时间:2010-02-06 20:37:04

标签: c# xml winforms

我有一个带有成员“地址”的类,我从一个XML文件读取,该文件具有以下格式(虚假地址 - XML字段名称为“地址” - 未显示):

106-1190 Crescent St. \ r \ n Toronto Ont \ r \ n \ nV2K 2Z6

我创建了一个多行文本框,以Accepts-Return属性设置为true的形式显示。

文本框显示以下内容,换行字符不起作用

106-1190 Crescent St. \ r \ n Toronto Ont \ r \ n \ nV2K 2Z6

我在网上寻找各种解决方案,我尝试了以下方法:

1)\ n和\\ n

2)\\ r \\ n

如果我像这样直接添加属性,它就有效:

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

但是如果我从XML文件加载一个字符串变量并尝试将其分配给Text属性:

Address.Text = Employee.Address;

它不起作用。

我设置了观察点,以检查直接分配和变量赋值之间的差异,得到了这个差异:

直接: 106-1190 Crescent St. \ r \ n Toronto Ont \ r \ n \ nV2K 2Z6

变量: 106-1190 Crescent St. \\ r \\ n Toronto Ont \\ r \\ n V2K 2Z6

所以某些地方代码正在将反斜杠更改为从XML字符串转换为变量的双反斜杠。

我真的不想解析我的XML字符串以删除额外的斜杠.... 如何在XML文件中表示我的字符串数据,以便只使用单斜杠将其转换为正确的字符串变量,以便正确显示换行符。

提前致谢。

5 个答案:

答案 0 :(得分:6)

文本框控件不解释转义,也不解释XML。所以这只是字符\ r和n。你需要处理字符串,用字符串@“\ r \ n”代替“\ r \ n”。

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

这相当于这个

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

因为@阻止在字符串中解释\。

编辑:基于评论,这是更好的形式,它在unix上转换为\ n,在Windows上转换为\ r \ n。

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

答案 1 :(得分:3)

当您在源代码中说"\n"时,编译器会将\n转换为换行符,但是当您阅读XML时,您会得到两个不同的字符\和{{1} }。这些不受编译器处理,因此不会转换为换行符。相反,它将以字符串形式表示为n,即转义后的反斜杠后跟n。

最简单的修复方法可能是在显示之前替换字符。

"\\n"

更好的方法是确保生成的XML数据不包含转义序列。这些不是XML的一部分,应该只是正常的换行符。

答案 2 :(得分:1)

您应该使用raw strings,然后您可以撰写@"106-1190 Crescent St.\r\nToronto Ont\r\nV2K 2Z6"。这会导致处理字符串文字而不进行任何特定于语言的解释,因此"\n"仍为"\n"

同样,要从变量中分配原始字符串,请使用:

Address.Text = @Employee.Address;

编辑:我也同意那些打电话给String.Replace("\\r\\n", Environment.NewLine);的人。这是一个更加独立于平台的解决方案,而不是将其替换为"\r\n",而Console.WriteLine()等方法无论如何都会附加Environment.NewLine而不是硬编码的"\n"。请参阅MSDN's writeup on Environment.NewLine

答案 3 :(得分:0)

  

106-1190 Crescent St. \ r \ n Toronto Ont \ r \ n \ nV2K 2Z6

我认为从XML字段读取时它会发生变化。检查或在读取后尝试将字符串值两个反斜杠替换为一个反斜杠。

答案 4 :(得分:0)

你在这里。

Address.Text = Employee.Address.Replace(“ \ n”,Environment.NewLine);