Страницы

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

понедельник, 3 февраля 2020 г.

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

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

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

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