C# 在LINQ到XML中没有结果

C# 在LINQ到XML中没有结果,c#,xml,linq,C#,Xml,Linq,我对LINQ完全陌生,希望开始学习LINQ到XML。我已经阅读了文档,并试图在网上找到答案,但没有结果 这是我使用的XML: <?xml version="1.0" encoding="utf-8" ?> <parameters> <view name="some_view"> <col name="name"> <width>150</width> </col> </v

我对LINQ完全陌生,希望开始学习LINQ到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>

root
元素就在那里,因为调用
root.subjections(“视图”)
会给我两个节点。但是当我像上面那样运行LINQ时,我没有得到任何结果,我希望从XML中获得第一个
视图
节点。

我认为您缺少属性中的值。

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

是否执行所需操作

我认为您缺少属性中的。

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

你想要什么?

我想你的问题是调用
XAttribute.Equals
XAttribute
是一种引用类型,尽管它可以覆盖Equals方法,但如果它这样做,则会产生误导行为。我希望您需要
属性(“名称”).Value.Equals(“某些视图”)


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

我认为您的问题在于调用
XAttribute.Equals
XAttribute
是一种引用类型,尽管它可以覆盖Equals方法,但如果它这样做,则会产生误导行为。我希望您需要
属性(“名称”).Value.Equals(“某些视图”)


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

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

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

这可以确保如果
视图
节点没有
名称
属性,代码不会因
NullReferenceException
而崩溃。

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

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

如果
视图
节点没有
名称
属性,这可以确保代码不会因
NullReferenceException而崩溃。

使用\u view.attribute(“name”).Value.Equals(“某些视图”)

使用\u view.attribute(“name”).Value.Equals(“某些视图”)相反。

您的代码是正确的,您只需访问
属性值

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

您的代码是正确的,您只需访问
属性值

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


“root.substands(“视图”)给了我两个节点。”这是正确的。XML中有两个
view
节点。你的问题是什么?@DanielHilgarth我想获取属性
name
设置为特定值的节点。@BartFriederichs要访问
属性
值,请使用
\u view.attribute(“name”).value
“root.subjections(“view”)给我两个节点。”这是正确的。XML中有两个
view
节点。你的问题是什么?@DanielHilgarth我想获取属性
名称
设置为特定值的节点。@BartFriederichs要访问
属性
值,请使用
\u view.attribute(“name”).value
。此处不需要
等于
,出于兴趣,如果
视图
没有
名称
当它试图转换到
字符串
时会发生什么,为什么不失败?
等于
在这里是个坏主意,因为
((字符串)视图。属性(“名称”)
如果
名称
属性不存在,那么
将是
空的。在这种情况下,使用
Equals
将导致
NullReferenceException
。@RGraham:API就是这样设计的。有关结果,请参阅我之前的评论。@KendallFrey我一直认为
==
不适用于字符串。我猜这是来自Java的一些背景,它是引用等式。这里不需要
等式
?出于兴趣,如果
视图
没有
名称
当它试图转换到
字符串
时会发生什么,为什么不失败?
等式
在这里是个坏主意,因为
((string)\u view.Attribute(“name”))如果
name
属性不存在,则
将为
null
。在这种情况下,使用
Equals
将导致
NullReferenceException
。@RGraham:API就是这样设计的。有关结果,请参阅我之前的评论。@KendallFrey我一直认为
==
不适用于字符串。我猜这是来自于Java的背景,它是引用平等。这是一段糟糕的代码。如果在至少一个
视图
节点上没有
名称
属性,它将崩溃。有关执行此查询的安全方法,请参阅。感谢您的建议,我没有考虑到这一点,因此已将其包含在编辑中。这是错误的代码。如果在至少一个
视图
节点上没有
名称
属性,它将崩溃。有关执行此查询的安全方法,请参阅。感谢您的建议,我没有考虑到这一点,因此已将其包含在编辑中。这是错误的代码。如果在至少一个
视图
节点上没有
名称
属性,它将崩溃。有关执行此查询的安全方法,请参阅。我并不打算指示应该使用我提供的代码段,它只是演示了对OP代码中最明显问题的最小更正。我希望很明显,它有自己的缺陷,您已经正确地指出了。这是糟糕的代码。如果在至少一个
视图
节点上没有
名称
属性,它将崩溃。有关执行此查询的安全方法,请参阅。我并不打算指示应该使用我提供的代码段,它只是演示了对OP代码中最明显问题的最小更正。我希望这是相当明显的,它有自己的不足之处,你已经正确地指出了。请为你的解决方案提供更多的描述!多描述