我必须在C#应用程序中读取数据表后创建xml。除了“'”和“& ”之外,此逻辑工作正常。遇到这些特殊字符时,生成的xml中出现错误。错误是“缺少必需的空格”
对于以下代码,如何使其适用于上述特殊字符,有哪些更改?
框架:。Net 3.0
注意:下面给出的代码解释了所有有效字符和无效字符(特殊字符)。
注意:数据表是从csv文件中读取的,该文件看起来像
ZipCode,City,State,County
92357,VETRANS' HOSPITAL,CA,SAN BERDINO
36675,MOBLE P&DC,AL,MOBLE
代码落后......
StringBuilder xmlForCSV = new StringBuilder();
xmlForCSV.Append("<root>");
foreach (DataRow excelRow in dtCSVExcelSource.Rows)
{
string zipCode = RemoveSpecialCharacters(excelRow["ZipCode"].ToString());
string city = RemoveSpecialCharacters(excelRow["City"].ToString());
string state = RemoveSpecialCharacters(excelRow["State"].ToString());
string county = RemoveSpecialCharacters(excelRow["County"].ToString());
xmlForCSV.Append("<row ZipCode='" + zipCode +
"' City='" + city +
"' State='" + state +
"' County='" + county + "'/>");
}
xmlForCSV.Append("</root>");
功能是
private string RemoveSpecialCharacters(string str)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.Length; i++)
{
if ((str[i] >= '0' && str[i] <= '9') || (str[i] >= 'A' && str[i] <= 'z' || (str[i] == '.' || str[i] == '_' || str[i] == '-' || str[i] == ' ' || str[i] == '(' || str[i] == ')' || str[i] == '/' || str[i] == '\\' || str[i] == '\'' || str[i] == '#')))
{
sb.Append(str[i]);
}
else
{
if (str[i] == '&')
{
string ampersand = System.Convert.ToString(str[i]);
}
else
{
string specialCharacter = System.Convert.ToString(str[i]);
}
}
}
return sb.ToString();
}
由于
Lijo
答案 0 :(得分:2)
您使用单引号'
来围绕您的属性。您的RemoveSpecialCharacters
函数不会删除您创建的XML无效的内容:
<row ... City='VETRANS' HOSPITAL' ... />
造成了麻烦。
快速解决方法是禁止RemoveSpecialCharacters
中的单引号。
有关自动转义特殊字符的方法,请查看here。
一般情况下,您不应该使用StringBuilder
编写XML。使用类似XmlTextWriter
或XDocument
甚至dtCSVExcelSource.WriteXml(...)
的内容。
BTW:您的RemoveSpecialCharacters
函数存在很多问题。
else
块中的代码无法执行任何操作str[i] >= 'A'
之前开始的括号似乎没有得到适当平衡str[i] >= 'A' && str[i] <= 'z'
不常见,并允许使用以下字符:[\]^_