1

我对 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视图节点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那里,因为调用给root.Descendants("view")了我两个节点。但是当我像上面那样运行 LINQ 时,我没有得到任何结果,我希望view从 XML 中获取第一个节点。

4

5 回答 5

4

我想你错过了 . Value从属性:

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

做你想做的

于 2013-09-09T11:50:34.100 回答
2

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

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

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

于 2013-09-09T11:51:46.370 回答
1

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

但是,不能保证这是唯一的问题-我目前无法进行测试。

于 2013-09-09T11:50:44.433 回答
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;
于 2013-09-09T16:12:34.267 回答
0

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

于 2013-09-09T12:04:45.350 回答