从DataTable创建XML时出错

时间:2011-07-28 10:02:32

标签: c# .net asp.net xml windows

我必须在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

1 个答案:

答案 0 :(得分:2)

您使用单引号'来围绕您的属性。您的RemoveSpecialCharacters函数不会删除您创建的XML无效的内容:

<row ... City='VETRANS' HOSPITAL' ... />

造成了麻烦。

快速解决方法是禁止RemoveSpecialCharacters中的单引号。

有关自动转义特殊字符的方法,请查看here

一般情况下,您不应该使用StringBuilder编写XML。使用类似XmlTextWriterXDocument甚至dtCSVExcelSource.WriteXml(...)的内容。

BTW:您的RemoveSpecialCharacters函数存在很多问题。

  • else块中的代码无法执行任何操作
  • str[i] >= 'A'之前开始的括号似乎没有得到适当平衡
  • 允许范围str[i] >= 'A' && str[i] <= 'z'不常见,并允许使用以下字符:[\]^_