LINQ to XML没有结果

时间:2013-09-09 11:45:20

标签: c# xml linq

我是LINQ的新手,想要开始学习LINQ to XML。我已阅读文档并尝试在线查找答案,但无济于事。

这是我使用的XML:

<?xml version="1.0" encoding="utf-8" ?>
<parameters>
  <view name="some_view">
    <col name="name">
      <width>150</width>
    </col>
  </view>
  <view name="anotherview">
    <col name="colname">
      <format>D12</format>
    </col>
  </view>
</parameters>

我试图像这样获取视图view的{​​{1}}节点:

some_view

XElement root = XElement.Load("params.xml"); var test = from _view in root.Descendants("view") where _view.Attribute("name").Equals("some_view") select _view; 元素在那里,因为对root的调用给了我两个节点。但是当我像上面那样运行LINQ时,我得不到任何结果,我希望从XML获得第一个root.Descendants("view")节点。

5 个答案:

答案 0 :(得分:4)

我认为你错过了属性中的。Value

var test = (from _view in xml.Descendants("view")
            where _view.Attribute("name") != null && _view.Attribute("name").Value == "some_view" 
            select _view).SingleOrDefault();

你想做什么

答案 1 :(得分:2)

您目前将该属性与some_view进行比较。您需要将其值与该字符串进行比较。通过将属性转换为string并使用相等运算符来执行此操作:

var test = from _view in root.Descendants("view") where 
    ((string)_view.Attribute("name")) == "some_view" select _view;

如果NullReferenceException节点没有view属性,这可确保您的代码不会因name而崩溃。

答案 2 :(得分:1)

我认为您的问题是对XAttribute.Equals的调用。 XAttribute是一种引用类型,虽然它可以覆盖Equals方法,但如果它这样做会产生误导性行为。我希望你会想要Attribute("name").Value.Equals("some_view")

不保证这是唯一的问题 - 我现在无法测试。

答案 3 :(得分:0)

使用 _view.Attribute(“name”)。Value.Equals(“some_view”)代替。

答案 4 :(得分:0)

您的代码是正确的,您只需访问attribute value

  XElement root = XElement.Load("params.xml");
   var test = from _view in root.Descendants("view") where 
              _view.Attribute("name").value.Equals("some_view") 
              select _view;