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

C# linq到xml:如何在C中获取元素中标记的值,c#,.net,xml,linq,linq-to-xml,C#,.net,Xml,Linq,Linq To Xml,我有以下xml数据 <?xml version="1.0" encoding="utf-8" ?> <mail> <id>signUpConfirmation</id> <subject>Activation</subject> <body> Hi, You account is activated \nRegards </body> </mail> 我得到一个错误: 序列不

我有以下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标记的值。

您有几个问题:

id和body不是属性而是元素,因此需要使用.elements 您正在使用XElement解析xml。它将从第一个元素开始,即mail,然后您将查找它的子元素,其名称为mail,但不存在。使用XDocument。 代码:

下面是有效的代码

XDocument

而不是

希莱门特


End.Element如@DKR所说。

id和body不是属性。使用.Element.exe进行更改。还是一样的错误。问题已更新。您可能应该使用,而不是解析字符串……如果您不理解为什么LINQ查询不会生成结果,请将其拆分为多个部分并进行检查。否则你可能要花很长时间才能弄明白Elementsmail也不会起作用。为什么有人会否决这个问题。尽管已经被问过很多次了,但我没有找到任何解决问题的方法。@ DKR-请考虑在15分钟通过时解决标记:一件事。如果除了身体,我还想要主体的价值呢。。我们可以用同样的问题来解决这个问题吗?对于这个基本的问题我很抱歉,但我对linq是新手。thanks@DKR-见更新:但请将此额外要求添加到我已更新的问题中。谢谢我使用的是result.First来访问它,它给了我一个完整的字符串,我如何区分这两个值?@DKR-它现在返回一个具有两个属性的对象,因此先将.result存储到一个变量,然后访问它的.Body和.Subject
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());
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();