【问题标题】:linq to xml: How to get value of a tag in an element in C#linq to xml:如何在 C# 中获取元素中标记的值
【发布时间】:2023-03-17 12:12:01
【问题描述】:

我有以下 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 从 &lt;body&gt; 标签中读取值。

这是我尝试过的

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 标签的值。

【问题讨论】:

  • idbody 不是属性。使用.Element
  • 进行了更改。仍然是同样的错误。问题已更新。
  • 您可能应该使用XDocument.Load(),而不是解析字符串。
  • ...如果您不明白为什么 LINQ 查询不会产生任何结果,请将其分解并检查它们。否则你可能会永远发现Elements("mail") 也不起作用。
  • 为什么有人会否决这个问题。尽管被问了很多次,但我没有找到任何解决我的问题的方法。

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


【解决方案1】:

你有几个问题:

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

【讨论】:

  • @DKR - 请考虑在 15 分钟过去后标记为已解决 :)
  • 还有一件事。如果与(“body”)一起,我也想要(“subject”)的值。我们可以用相同的查询来做到这一点,我很抱歉这个基本问题,但我是 linq 的新手。谢谢
  • @DKR - 查看更新 :) 但也请将此额外要求添加到问题中
  • 我已经更新了问题。谢谢。我正在使用 result.First() 来访问给我一个完整的字符串,我如何分隔这两个值。?
  • @DKR - 它现在返回一个具有 2 个属性的对象,因此将 .First() 的结果存储到一个变量中,然后访问它的 .Body.Subject
【解决方案2】:
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 文档

而不是

X元素

如@DKR 所说,结束 .Element。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多