linq to xml:如何在 C# 中获取元素中标记的值

linq to xml: How to get value of a tag in an element in C#

我有以下 xml 数据。

<?xml version="1.0" encoding="utf-8" ?>
<mail>
  <id>signUpConfirmation</id>
  <subject>Activation</subject>
  <body>
Hi, You account is activated \nRegards
</body>
</mail>

我需要根据我传递的 id 从 <body> 标签中读取值。

这是我试过的

var xml = File.ReadAllText("C:\Users\DELL\Documents\Visual Studio 2012\Projects\Website\Website\Files\Mails.xml");

var str = XElement.Parse(xml);
var result = from mail in str.Elements("mail")
             where (string)mail.Element("id") == "signUpConfirmation"
             select (string)mail.Element("body");
log.Debug("mail data:" + result.First());

我收到错误:

Sequence contains no elements.

此外,我还想在同一个查询中访问 id 标签的值。

你有几个问题:

  1. idbody不是属性而是元素所以你需要使用.Elements
  2. 您正在使用 XElement 解析 xml。它将从第一个元素 mail 开始,然后您正在寻找它的名称为 mail 的子元素 - 这是不存在的。使用 XDocument.

代码:

var result = (from mail in XDocument.Load("data.xml").Descendants("mail")
              where mail.Element("id").Value == "signUpConfirmation"
              select new {
                  Body = mail.Element("body").Value,
                  Subject = mail.Element("subject").Value
              }).ToList();
var str = XDocument.Parse("<?xml version=\"1.0\" encoding=\"utf-8\" ?><mail>  <id>signUpConfirmation</id>  <subject>Activation</subject>  <body>Hi, You account is activated \nRegards</body></mail>");

var result = from mail in str.Elements("mail")
where (string)mail.Element("id") == "signUpConfirmation"
select mail.Element("body");
result.FirstOrDefault();

这是有效的代码。

XDocument

而不是

XElement

如@DKR 所说,结束.Element。