#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
Комментариев нет:
Отправить комментарий