Какие способы чтения xml файла существуют в C#, кроме XmlDocument, XmlDocumentXPatch и XmlReader ?
update: Мне нужен способ чтения от элемента к элементу, и допустим вывод их на консоль, при этом xml большие, поэтому первые два способа использовать нельзя.
update2: вот что получилось набросать, проблема в генерации полноценного запроса Insert, учитывая вложенность, сейчас просто для примера добавляется 1 элемент
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);
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();
}
}
Ответ
Способы чтения xml, существующие в .NET:
XmlReader
XmlDocument
XPathDocument
XDocument/XElement
XmlSerializer
DataContractSerializer / SoapFormatter
DataSet.ReadXml / DataTable.ReadXml
Последние два пункта только для документов определённой структуры, не произвольной. Добавил их для полноты картины.
Если файлы большие, то подходит только первый способ.
Если не хочется вручную возиться с запоминанием родителей в переменных, то можно применить следующий подход: считываем регулярно повторяющиеся поддеревья в XElement (или другой класс по нраву). Но это применимо только для файлов с повторяющейся структурой.
Допустим, имеется следующий файл:
Предполагается, что узлов person много. Таким образом, в память загружается лишь одно такое поддерево за раз.
using (var xmlReader = XmlReader.Create("file.xml"))
{
while (xmlReader.Read())
{
if (xmlReader.ReadToFollowing("person"))
{
XmlReader personSubtree = xmlReader.ReadSubtree();
XElement personElement = XElement.Load(personSubtree);
// здесь обрабатываем personElement
}
}
}
Комментариев нет:
Отправить комментарий