Ошибка при создании XML из DataTable - PullRequest
0 голосов
/ 28 июля 2011

Я должен создать XML после чтения из таблицы данных в приложении C #. Эта логика работает нормально, за исключением « »и« & ». Когда эти специальные символы встречаются, произошла ошибка в сгенерированном xml. Ошибка «Отсутствует необходимый пробел»

Какие изменения необходимо внести в следующий код, чтобы он работал для указанных выше специальных символов?

Framework : .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 Ответ

2 голосов
/ 28 июля 2011

Вы используете одинарную кавычку ', чтобы окружить ваши атрибуты.Ваша RemoveSpecialCharacters функция не устраняет недопустимость создаваемого вами XML-кода:

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

вызывает проблему.

Быстрое решение состоит в том, чтобы запретить одинарные кавычки в RemoveSpecialCharacters.

Чтобы узнать о способах автоматического экранирования специальных символов, смотрите здесь .

В общем, хотя вам не следует писать XML с использованием StringBuilder.Используйте что-то вроде XmlTextWriter или XDocument или даже dtCSVExcelSource.WriteXml(...).

Кстати: ваша функция RemoveSpecialCharacters имеет множество проблем.

  • Код в elseблок ничего не делает
  • Скобки, начинающиеся до str[i] >= 'A', не кажутся правильно сбалансированными
  • Разрешение диапазона str[i] >= 'A' && str[i] <= 'z' необычно и допускает такие символы, как: [\]^_
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...