WriteXML, проблема ReadXML с именем таблицы
У меня есть программа, в которой я запускаю запрос и сохраняю данные в DataTable. Затем я разрешаю пользователю сохранить этот DataTable.WriteXML. У меня проблема в том, что я хочу прочитать этот сохраненный файл (файл XML) в другой DataTable с другим именем - и это не позволяет! Это дает мне ошибку "Ошибка при загрузке таблицы результатов в файл: таблица данных:" ImportTable "не соответствует ни одной DataTable в источнике"
Теперь я считаю, что это сообщение говорит мне, что XML содержит имя таблицы, отличное от таблицы данных, которую я пытаюсь вставить в нее в формате ReadXML. Я попытался установить свойство TableName пустым - но это не имеет никакого значения.
Итак, мой вопрос: как другие могут обойти эту проблему? Я использую стандартные DataTable.WriteXML (имя файла) - и вызовы метода DataTable.ReadXML. И из-за некоторых проблем проектирования - мне нужно, чтобы DataTable импорта назвали иначе, чем тот, который использовался для экспорта данных.
Есть ли другой способ записать и прочитать данные в DataTable, чтобы обойти эту проблему?
Пример кода - показ проблемы. В форме загрузки - создайте две таблицы - одну с именем "Экспорт", а другую - "Импорт". Создайте структуру для экспорта - и заполните ее 10 записями.
private void Form_Main_Load(object sender, EventArgs e)
{
ExportTable = new DataTable("Export");
ImportTable = new DataTable("Import");
ExportTable.Columns.Add("ID", Type.GetType("System.Int32"));
ExportTable.Columns.Add("Name", Type.GetType("System.String"));
ExportTable.Columns.Add("Amount", Type.GetType("System.Int32"));
// Populate the first one
DataRow workRow;
for (int i = 0; i <= 9; i++)
{
workRow = ExportTable.NewRow();
workRow[0] = i;
workRow[1] = "CustName" + i.ToString();
workRow[2] = i;
ExportTable.Rows.Add(workRow);
}
}
Затем создайте две кнопки - одну для экспорта данных, а другую для импорта данных.
private void button_Export_Click(object sender, EventArgs e)
{
ExportTable.WriteXml("c:\\Temp\\TableOut.xml");
}
private void button_Import_Click(object sender, EventArgs e)
{
ImportTable.ReadXmlSchema("c:\\Temp\\TableOut.xml");
ImportTable.ReadXml("c:\\Temp\\TableOut.xml");
}
Запустите программу - экспортируйте данные - затем нажмите кнопку "Импорт". Когда вы это сделаете - вы получите ошибку - "DataTable" Import "не соответствует ни одной DataTable в источнике". Теперь - я понимаю, это потому, что в XML есть имя таблицы экспорта, встроенное в XML. В моем случае мне нужно импортировать эти данные в DataTable с другим именем - и мне интересно, как (и если) другие имели дело с этим в прошлом? Вы вручную изменили имя в XML? Вы временно изменили имя, которое можно датировать? ИЛИ Есть ли другой лучший способ обойти эту проблему, пытаясь использовать метод READXML для DataTable?
1 ответ
Хорошо - я играл с этим - и есть решение. Не уверен, что это лучше (и я был бы признателен за любые комментарии о том, как я мог бы сделать это лучше).
По сути, мне нужно было записать XML в программу чтения строк - изменить имя таблицы для схемы и элементов записи. И <>, и теги.
Затем, когда я прочитал это - мне пришлось сделать обратное - в основном, прочитать файл в строку - затем изменить все имена таблиц обратно на то, что мне нужно, чтобы они были. Затем мне пришлось записать файл на диск (временный файл), а затем использовать метод ReadXML, чтобы прочитать этот временный файл, а затем удалить файл. Я не уверен, почему ReadXML со средством чтения строк не работал (кажется, что это допустимый параметр) - но я нашел несколько постов, в которых говорилось, что существуют проблемы с методом READXML и программами чтения строк - поэтому я просто написал его для файла и использовал READXML с именем файла - и все работало нормально.
Я надеюсь, что это поможет другим - даже если это не "лучшее" решение - возможно, кто-то еще сможет улучшить его.
Написать XML
// Write XML
StringWriter sw = new StringWriter();
ResultDT.WriteXml(sw, XmlWriteMode.WriteSchema);
string OutputXML = sw.ToString();
// now replace the Table Name
OutputXML = OutputXML.Replace("<" + ResultDT.TableName + ">", "<" + "ExportTable" + ">");
OutputXML = OutputXML.Replace("</" + ResultDT.TableName + ">", "</" + "ExportTable" + ">");
OutputXML = OutputXML.Replace("MainDataTable=\"" + ResultDT.TableName + "\"", "MainDataTable=\"" + "ExportTable" + "\"");
OutputXML = OutputXML.Replace("name=\"" + ResultDT.TableName + "\"", "name=\"" + "ExportTable" + "\"");
System.IO.File.WriteAllText(fileName, OutputXML);
Читать XML
// Read XML
InputXML = System.IO.File.ReadAllText(fileName);
// now replace the Table Name
InputXML = InputXML.Replace("<" + "ExportTable" + ">", "<" + ResultTable.TableName + ">");
InputXML = InputXML.Replace("</" + "ExportTable" + ">", "</" + ResultTable.TableName + ">");
InputXML = InputXML.Replace("MainDataTable=\"" + "ExportTable" + "\"", "MainDataTable=\"" + ResultTable.TableName + "\"");
InputXML = InputXML.Replace("name=\"" + "ExportTable" + "\"", "name=\"" + ResultTable.TableName + "\"");
string TempFileName = "TempDumpFile.idt";
System.IO.File.WriteAllText(TempFileName, InputXML);
ResultTable.ReadXmlSchema(TempFileName);
ResultTable.ReadXml(TempFileName);
System.IO.File.Delete(TempFileName);