linq to xml - 获取具有特定属性的那些节点的子节点

时间:2013-04-23 18:00:11

标签: c# linq linq-to-xml

我有以下XML结构:

<partners>
  <partner partner="xxxxxx" Id="12345">
    <email>aa@aa.com</email>
    <email>bb@bb.com</email>
  </partner>
  <partner partner="yyyyyyy" Id="32165">
    <email>aa@aa.com</email>
    <email>bb@bb.com</email>
  </partner>
</partners>

我正在尝试从ID中获取某个合作伙伴的所有电子邮件地址,但却无法获得它。

到目前为止我已尝试过这个:

var x = from a in xdoc.Elements("partner") where a.Attribute("Id").Value == rpId.ToString() select a.Value;

任何想法有什么不对?

1 个答案:

答案 0 :(得分:3)

目前,您只是选择相关合作伙伴元素中的文字 - 而且您最终会得到序列的结果。

我想你想要:

var query = xdoc.Root.Elements("partner")
                .Single(x => (string) x.Attribute("Id") == rpId.ToString())
                .Elements("email")
                .Select(x => x.Value);

如果没有具有给定ID的元素 - 或多个元素,则会失败。如果您只想查找所有匹配元素中的所有电子邮件地址,可以使用:

var query = xdoc.Root.Elements("partner")
                .Where(x => (string) x.Attribute("Id") == rpId.ToString())
                .Elements("email")
                .Select(x => x.Value);

编辑:鉴于评论,我已将xdoc.Elements更改为xdoc.Root.Elements;我怀疑你有:

XDocument xdoc = XDocument.Load(...);

这意味着xdoc.Elements(...)只能找到根元素 - 而您想要从根元素中搜索