Задача состоит в следующем - на основе xml и xsd файла необходимо создать БД в ms sql и засунуть туда информацию из xml файла (xml и xsd заранее не известны). Т.к. размер xml заранее не известен, то применять DataSet.ReadXml проблематично, вероятна ошибка нехватки памяти.
Самое оптимальное что удалось найти это использование XmlReader, но так как чтение идет последовательно сверху вниз, то тут возникает проблема в формировании запроса INSERT - идея в том что если в узле содержаться элементы со значениями и эти элементы одинакового уровня вложенности, то формируем запрос на вставку этих значений в таблицу с именем "родительского" элемента.
<a>
<b>
<c>val1</c>
<d>val2</d>
</b>
<e>val3</e>
<f>val4</f>
</a>
В данном случае необходимо в таблицу a вставить значения b e f, а в таблицу b значения c и d. Сама база данных сейчас создается на основе DataSet.ReadXmlSchema и потом для каждой DataTable я создаю таблицу в БД. Вот что удалось пока написать
while (xml.Read())
{
if (xml.NodeType.ToString() == "Element")
{
if (xml.IsEmptyElement != true)
{
myStack.Push(xml.Name);
}
}
else if (xml.NodeType.ToString() == "Text")
{
string first = myStack.Peek().ToString();
myStack.Pop();
string second = myStack.Peek().ToString();
myStack.Push(first);
Console.WriteLine("table {0} column {1} value {2}", second, first, xml.Value);
string cmd = "INSERT INTO " + second + " (" + first + ") VALUES ('" + xml.Value + "')";
SqlCommand command = new SqlCommand(cmd, conn);
command.ExecuteNonQuery();
}
else if (xml.NodeType.ToString() == "EndElement")
{
myStack.Pop();
}
}
Но тут в одну строку только одно значение, что соответственно не правильно.