我是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")
节点。
答案 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;