【问题标题】:Reading XML nodes with LINQ使用 LINQ 读取 XML 节点
【发布时间】:2013-10-04 15:50:14
【问题描述】:

我在使用 LINQ 读取 XML 文件时遇到问题。

这是我的 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<Employees>
  <Employee>
    <Name Type="First">Jack</Name>
    <Name Type="Last">Black</Name>
  </Employee>
  <Employee>
    <Name Type="First">John</Name>
    <Name Type="Last">Blue</Name>
  </Employee>
  <Employee>
    <Name Type="First">Dan</Name>
    <Name Type="Last">Red</Name>
  </Employee>
  <Employee>
    <Name Type="First">Patrick</Name>
    <Name Type="Last">Green</Name>
  </Employee>
</Employees>

我正在使用的代码如下

    XElement doc = XElement.Load("xmldoc.xml");
    var query = from x in doc.Elements("Employee") where x.Element("Name").Attribute("Type").Value == "First" select x;
    foreach (XElement item in query)
    {
        Console.WriteLine(item.Element("Name").Value);
    }

此代码返回我所有的名字,但是当我将属性值从第一个更改为最后一个时,它变为空白。

当我切换名称节点时,它会返回姓氏。对我来说,看起来每个员工查询都从第一个名称节点返回值并忽略第二个。你能帮我解决这个问题吗?

【问题讨论】:

  • 您真的想要查询结果中的Employee 元素,还是只是名称?如果你只想要名字,那么你需要从名字中选择,而不是从员工中选择。否则,您需要转换结果(例如 XPath)以过滤掉您不想要的标签。或者你可以干脆完全放弃where,并在foreach中获取你想要的标签:Console.WriteLine(item.Elements("Name").Single (i =&gt; i.Attribute("Type").Value == "Last").Value);

标签: c# xml


【解决方案1】:

问题在于x.Element("Name") 调用将返回第一个Name 元素。您实际上需要查询所有Name 元素并过滤具有Last 属性值的元素。

试试这个:

var query = from x in doc.Elements("Employee").Elements("Name")
            where x.Attribute("Type").Value == "Last"
            select x;

foreach (XElement item in query)
{
    Console.WriteLine(item.Value);
}

【讨论】:

  • 像魅力一样工作,但有一个小问题。只有当我使用 XDocument 而不是 XElement 打开 XML 文件时,您的代码才有效。
  • @user2847238 对,我使用的是XDocument,所以我添加了Root 属性。我意识到您使用的是XElement,因此不需要它。我更新了帖子,现在应该没问题了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
相关资源
最近更新 更多