Страницы

Поиск по вопросам

воскресенье, 7 апреля 2019 г.

Способы чтения xml файла

Какие способы чтения 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 (или другой класс по нраву). Но это применимо только для файлов с повторяющейся структурой.
Допустим, имеется следующий файл:
Vasya

Mars New Vasyuki

Petya
Earth Urupinsk

Предполагается, что узлов 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 } } }

Комментариев нет:

Отправить комментарий