Как десериализовать только часть большого 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);
    }

Могу ли я использовать рекурсию в такой ситуации? Если нет, то как еще я могу найтибазовая категория "?

Ответы на вопрос(1)

Ваш ответ на вопрос