#c_sharp #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(); } }
Ответы
Ответ 1
Способы чтения 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 } } } Vasya Mars New Vasyuki Petya Earth Urupinsk
Комментариев нет:
Отправить комментарий