Praveen
Praveen

Reputation: 772

Need help reading XML using LINQ

I'm trying to bind the contents of the following file using LINQ but having issues with the syntax.

<metadefinition>
  <page>
    <name>home</name>
    <metas>
      <meta>
        <metaname>
          title
        </metaname>
        <metavalue>
          Welcome Home
        </metavalue>
      </meta>

      <meta>
        <metaname>
          description
        </metaname>
        <metavalue>
          Welcome Home Description
        </metavalue>
      </meta>

    </metas>
  </page>

  <page>
    <name>results</name>
    <metas>
      <meta>
        <metaname>
          title
        </metaname>
        <metavalue>
          Welcome to Results
        </metavalue>
      </meta>
    </metas>
  </page>
</metadefinition>

My query looks like this but as you can see it is missing the retrieval of the metas tag. How do I accomplish this?

 var pages = from p in xmlDoc.Descendants(XName.Get("page"))
                            where p.Element("name").Value == pageName
                            select new MetaPage
                            {
                                Name = p.Element("name").Value,
                                MetaTags = p.Elements("metas").Select(m => new Tag { MetaName = m.Element("metaname").Value.ToString(),
                                                                                     MetaValue = m.Element("metacontent").Value.ToString()
                                }).ToList()
                            };

Upvotes: 0

Views: 64

Answers (1)

user1096188
user1096188

Reputation: 1839

If <metadefinition> is a root element, then there is no need for iterating over all descendants of the document, that's way too inefficient.

var pages = from p in xmlDoc.Root.Elements("page")
            where p.Element("name").Value == pageName
            select new MetaPage {
                Name = p.Element("name").Value,
                MetaTags = p.Element("metas").Elements("meta").Select(m=>new Tag{
                    MetaName = m.Element("metaname").Value.ToString(),
                    MetaValue = m.Element("metavalue").Value.ToString()
                }).ToList()
            };

Upvotes: 1

Related Questions