【问题标题】:Linq to XML query returns nullLinq to XML 查询返回 null
【发布时间】:2015-11-28 22:12:23
【问题描述】:

我有以下 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<tmx version="1.4">
  <header/>
  <body>
    <tu>
      <tuv lang="en">
        <seg>Hello?</seg>
      </tuv>
      <tuv lang="es">
        <seg>¿Diga?</seg>
      </tuv>
    </tu>
  </body>
</tmx>

我正在尝试使用此代码来检索第一个 &lt;seg&gt; 标记的内容:

root.Elements("tuv")
    .Where(e => e.Attribute("lang").Value.Equals("en"))
    .Select(e => e.Elements("seg"))
    .SingleOrDefault()
    .Where(d => d.Value.Equals(originalText))
    .SingleOrDefault()
    .Value;

originaltext 等于“你好?”在这种情况下。但是,给出的结果为空。我假设我的 linq 查询是错误的。谁能给我一个关于如何正确编写这个查询的提示?非常感谢!

【问题讨论】:

  • 因为root 没有Element "tuv"。
  • 确实 - 您可能想要使用 Descendants。您还可以使用 == 而不是调用 Equals 来简化代码,例如e.Attribute("lang").Value == "en"。我还强烈建议每行使用一个 LINQ 运算符(即方法调用) - 将代码垂直放置,这样会更容易阅读。接下来,SingleOrDefault 返回一个值……你不想在那之后使用Where
  • 感谢您的 cmets!
  • @JonSkeet 如何在不使用 SingleOrDefault 的情况下指定具有给定内容的单个 以及在哪里?
  • 你可能想要before SingleOrDefault 的位置。过滤到正确的序列,然后取其唯一的元素。

标签: c# xml linq linq-to-xml


【解决方案1】:

Elements 函数返回root 的直接子元素的集合。您应该使用返回所有后代元素集合的Descendants 方法。

root.Descendants("tuv").Where(e => e.Attribute("lang").Value == "en")
                       .Select(e => e.Elements("seg")).SingleOrDefault() 
                       .Where(d => d.Value == originalText).SingleOrDefault().Value

【讨论】:

  • 非常感谢!这就是我一直在寻找的。所以 Elements 没有工作,因为“tuv”不是直接的孩子......我不知道它是这样工作的......我的错。 :S
【解决方案2】:

如果要选择第一个“seg”元素,请执行此操作

var xDoc = XDocument.Parse(File.ReadAllText(@"C:\YourDirectory\sample.xml"));

var firstSeg = xDoc.Descendants("seg").First();

在注释中满足 OP 要求的代码

var seg = xDoc.Descendants("tuv")
                .First(tuv => tuv.Attribute("lang").Value == "en")
                .Element("seg")
                .Value;

【讨论】:

  • 谢谢,但这仅适用于本示例。很抱歉造成误解。
  • @Arturo 那么,您能否明确说明您的选择标准是什么?
  • 选择 中的 的内容,属性为 "lang" == "en"。 Lukas Kabrt 给出的答案奏效了。还是谢谢你:)。
  • 根据您的要求更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多