C# 在LINQ到XML中没有结果
我对LINQ完全陌生,希望开始学习LINQ到XML。我已经阅读了文档,并试图在网上找到答案,但没有结果 这是我使用的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
<?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代码中最明显问题的最小更正。我希望这是相当明显的,它有自己的不足之处,你已经正确地指出了。请为你的解决方案提供更多的描述!多描述