需要帮助使用LINQ读取XML

时间:2012-02-22 08:44:23

标签: linq linq-to-xml

我正在尝试使用LINQ绑定以下文件的内容,但是语法有问题。

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

我的查询看起来像这样但是你可以看到它缺少对metas标签的检索。我该如何做到这一点?

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

1 个答案:

答案 0 :(得分:1)

如果<metadefinition>是根元素,那么就不需要迭代文档的所有后代,这样效率太低。

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