【问题标题】:linq to xml - get childrem of those nodes with a certain attributelinq to xml - 获取具有特定属性的那些节点的子节点
【发布时间】:2013-04-24 02:18:55
【问题描述】:

我有以下 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;

有什么想法吗?

【问题讨论】:

    标签: c# linq linq-to-xml


    【解决方案1】:

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

    我想你想要:

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

    编辑:考虑到 cmets,我已将 xdoc.Elements 更改为 xdoc.Root.Elements;我怀疑你有:

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

    这意味着xdoc.Elements(...) 只能找到根元素——而您想根元素搜索。

    【讨论】:

    • hmmm - 即使我将查询简化为以下内容,它也是一个空序列: var query = xdoc.Elements("partner").Where(x => (string) x.Attribute( "Id") == rpId.ToString())
    • @ChrisCa:那么这表明没有合适的partner 元素。有很多潜在的原因,但我无法从这里检查任何一个。首先要检查 - 你得到了partner 元素。删除Where 子句,看看会发生什么。接下来,检查Id 属性和rpId 本身...
    • 其实连这个都是空的:var query = xdoc.Elements("partner");
    • @ChrisCa:那么这表明xdocXDocument 而不是XElement 用于根节点,因此您可能需要xdoc.Root.Elements("partner")。 (如果您提供一个简短但完整的程序开始,这会简单得多。)
    • 你是对的,xdoc 是一个 Xdocument(因此变量名)。但是更完整的代码 sn-p 肯定会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多