Как десериализовать только часть большого XML-файла в классы C #?
Мы уже читали некоторые посты и статьи о том, как десериализовать XML, но до сих порЯ понял, как я должен написать код, соответствующий моим потребностям, так что ... ям извиняюсь за еще один вопрос по десериализации xml))
У меня есть большой (50 МБ) XML-файл, который нужно десериализовать. Я использую xsd.exe для получения xsd-схемы документа, а затем автоматически генерирую файл классов c #, который помещаю в свой проект. Я хочу получить некоторые (не все) данные из этого XML-файла и поместить их в мою базу данных SQL.
Вот иерархия файла (упрощенно, xsd очень большой):
public class yml_catalog
{
public yml_catalogShop[] shop { /*realization*/ }
}
public class yml_catalogShop
{
public yml_catalogShopOffersOffer[][] offers { /*realization*/ }
}
public class yml_catalogShopOffersOffer
{
// here goes all the data (properties) I want to obtain ))
}
И вот мой код:
Первый подход:
yml_catalogShopOffersOffer catalog;
var serializer = new XmlSerializer(typeof(yml_catalogShopOffersOffer));
var reader = new StreamReader(@"C:\div_kid.xml");
catalog = (yml_catalogShopOffersOffer) serializer.Deserialize(reader);//exception occures
reader.Close();
Я получаю InvalidOperationException: в документе XML (3,2) произошла ошибка
Второй подход:
XmlSerializer ser = new XmlSerializer(typeof(yml_catalogShopOffersOffer));
yml_catalogShopOffersOffer result;
using (XmlReader reader = XmlReader.Create(@"C:\div_kid.xml"))
{
result = (yml_catalogShopOffersOffer)ser.Deserialize(reader); // exception occures
}
InvalidOperationException: в документе XML (0,0) произошла ошибка
в третьих:Я попытался десериализовать весь файл:
XmlSerializer ser = new XmlSerializer(typeof(yml_catalog)); // exception occures
yml_catalog result;
using (XmlReader reader = XmlReader.Create(@"C:\div_kid.xml"))
{
result = (yml_catalog)ser.Deserialize(reader);
}
И я получаю следующее:
error CS0030: The convertion of type "yml_catalogShopOffersOffer[]" into "yml_catalogShopOffersOffer" is not possible.
error CS0029: The implicit convertion of type "yml_catalogShopOffersOffer" into "yml_catalogShopOffersOffer[]" is not possible.
Итак, как исправить (или переписать) код, чтобы не получать исключения?
редактирует:Также, когда я пишу:
XDocument doc = XDocument.Parse(@"C:\div_kid.xml");
Возникает исключение XmlException: недопустимые данные на корневом уровне, строка 1, позиция 1.
Вот первая строка XML-файла:
редактирует 2: Краткий пример XML-файла:
OZON.ru
?????? "???????????????? ??????????????"
http://www.ozon.ru/
base category
bla bla bla
// here goes all the categories
// other offers
Постскриптум Я'мы уже приняли ответс идеальным). Но теперь мне нужно найтибазовая категория " для каждого предложения, используя categoryId. Данные являются иерархическими, а базовая категория - это категория, которая не имеет "ParentID» приписывать. Итак, я написал рекурсивный метод, чтобы найтибазовая категория ", но это никогда не заканчивается. Похоже, алгоритм не очень быстрый))
Вот мой код: (в методе main ())
var doc = XDocument.Load(@"C:\div_kid.xml");
var offers = doc.Descendants("shop").Elements("offers").Elements("offer");
foreach (var offer in offers.Take(2))
{
var category = GetCategory(categoryId, doc);
// here goes other code
}
Вспомогательный метод:
public static string GetCategory(int categoryId, XDocument document)
{
var tempId = categoryId;
var categories = document.Descendants("shop").Elements("categories").Elements("category");
foreach (var category in categories)
{
if (category.Attribute("id").ToString() == categoryId.ToString())
{
if (category.Attributes().Count() == 1)
{
return category.ToString();
}
tempId = Convert.ToInt32(category.Attribute("parentId"));
}
}
return GetCategory(tempId, document);
}
Могу ли я использовать рекурсию в такой ситуации? Если нет, то как еще я могу найтибазовая категория "?