从数据表创建XML时出错
本文关键字:出错 XML 创建 数据表 | 更新日期: 2023-09-27 18:03:53
我必须在c#应用程序中从数据表读取后创建xml。除了" ' "answers" & "之外,这个逻辑工作得很好。当遇到这些特殊字符时,生成的xml会出现错误。错误提示为"缺少必需的空白"
要对下面的代码进行哪些更改才能使其适用于上面提到的特殊字符?
框架: .Net 3.0
注意:下面给出的代码解释了什么都是有效字符,什么是无效字符(特殊字符)。
注意:数据表是从csv文件中读取的,该文件看起来像
ZipCode,City,State,County
92357,VETRANS' HOSPITAL,CA,SAN BERDINO
36675,MOBLE P&DC,AL,MOBLE
folllows… 代码
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
您使用单引号'
来包围您的属性。您的RemoveSpecialCharacters
函数不会删除它,因此您创建的XML无效:
<row ... City='VETRANS' HOSPITAL' ... />
是造成麻烦的原因。
一个快速的修复方法是禁止在RemoveSpecialCharacters
中使用单引号。
有关自动转义特殊字符的方法,请参阅此处。
一般来说,您不应该使用StringBuilder
编写XML。使用XmlTextWriter
或XDocument
甚至dtCSVExcelSource.WriteXml(...)
。
你的RemoveSpecialCharacters
函数有很多问题。
-
else
块中的代码不做任何事情 - 在
str[i] >= 'A'
之前开始的括号似乎没有正确平衡 - 允许范围
str[i] >= 'A' && str[i] <= 'z'
是不寻常的,允许字符如下:[']^_