Como desserializar apenas parte de um arquivo xml grande para c # classes?

Eu já li alguns posts e artigos sobre como desserializar xml, mas ainda não descobri a maneira que eu deveria escrever o código para corresponder às minhas necessidades, então .. Estou me desculpando por outra pergunta sobre desserializar xml))

Eu tenho um arquivo xml grande (50 MB) que eu preciso desserializar. Eu uso xsd.exe para obter o esquema xsd do documento e autogerar o arquivo c # classes que eu coloquei no meu projeto. Eu quero pegar alguns (não todos) dados deste arquivo xml e colocá-lo em meu banco de dados sql.

Aqui está a hierarquia do arquivo (simplificado, o xsd é muito grande):

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 ))
}

E aqui está o meu código:

Primeira abordagem:

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();

Eu recebo InvalidOperationException: há um erro no documento XML (3,2)

segunda abordagem:

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: há um erro no documento XML (0,0)

terceiro:Eu tentei desserializar o arquivo inteiro:

 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);
 }

E eu recebo o seguinte:

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.

Então, como consertar (ou sobrescrever) o código para não obter as exceções?

edições:Além disso, quando escrevo:

XDocument doc = XDocument.Parse(@"C:\div_kid.xml");

O XmlException ocorre: dados não permitidos no nível raiz, string 1, posição 1.

Aqui está a primeira string do arquivo xml:

<?xml version="1.0" encoding="windows-1251"?>

edições 2: O exemplo curto do arquivo xml:

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<yml_catalog date="2012-11-01 23:29">
<shop>
   <name>OZON.ru</name>
   <company>?????? "???????????????? ??????????????"</company>
   <url>http://www.ozon.ru/</url>
   <currencies>
     <currency id="RUR" rate="1" />
   </currencies>
   <categories>
      <category id=""1126233>base category</category>
      <category id="1127479" parentId="1126233">bla bla bla</category>
      // here goes all the categories
   </categories>
   <offers>
      <offer>
         <price></price>
         <picture></picture>
      </offer>
      // other offers
   </offers>
</shop>
</yml_catalog>

P.S. Eu já aceitei a resposta (é perfeita). Mas agora preciso encontrar "categoria base" para cada Oferta usando categoryId. Os dados são hierárquicos e a categoria base é a categoria que não possui o atributo "parentId". Então, eu escrevi um método recursivo para encontrar a "categoria base", mas nunca termina. Parece que o algoritmo não é muito rápido))
Aqui está o meu código: (no método 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
        }

Método auxiliar:

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);
    }

Posso usar recursão em tal situação? Se não, como mais posso encontrar a "categoria base"?

questionAnswers(1)

yourAnswerToTheQuestion