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

本文关键字:元素 获取 xml to linq | 更新日期: 2023-09-27 18:15:11

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

我得到错误:

序列不包含任何元素。

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

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

您有几个问题:

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

这是有效的代码。

X文档

而不是

XElement

结束。正如@DKR所说的元素。