按属性查找节点并返回不同的属性';s值
本文关键字:属性 节点 查找 返回 | 更新日期: 2023-09-27 18:24:11
例如,我在xml文件中有以下数据:
<Critic-List>
<bruce-bennett>
<Movie Title="White House Down (2013)" Score="C+" Like="false"/>
<Movie Title="Despicable Me 2 (2013)" Score="A-" Like="true"/>
<Movie Title="World War Z (2013)" Score="B+" Like="true"/>
<Movie Title="Man of Steel (2013)" Score="B+" Like="true"/>
我该如何写一个
- 按属性选择节点-比如attribute(title)="Despicable Me 2(2013)"
- 并且从所选节点中为该节点的另一个属性提供值,例如:attribute(like)。。。(在这种情况下,返回"true")
C#中的XML阅读器似乎更倾向于返回"内部文本"而不是属性值,我想知道我是否应该将XML数据存储在内部文本而不是属性中。。对我来说,检索属性的数据值会方便得多,但我不确定这些参数是否存在。。。
如有任何帮助或建议阅读,我们将不胜感激!
我不确定你想用什么方法来获得结果,LINQ to XML绝对是一个很好的方法。如果你想使用XPath,下面是如何获得同样的结果。
var xml = @"<Critic-List>
<bruce-bennett>
<Movie Title=""White House Down (2013)"" Score=""C+"" Like=""false""/>
<Movie Title=""Despicable Me 2 (2013)"" Score=""A-"" Like=""true""/>
<Movie Title=""World War Z (2013)"" Score=""B+"" Like=""true""/>
<Movie Title=""Man of Steel (2013)"" Score=""B+"" Like=""true""/>
</bruce-bennett>
</Critic-List>";
XElement doc = XElement.Parse(xml);
var node = doc.XPathSelectElement("//Movie[@Title='Despicable Me 2 (2013)']");
var like = node.Attribute("Like").Value;
w3schools是获取XPath教程的好网站。选择总是拓展视野的好方法。
您可以像这样使用LINQ到XML:
XElement doc = XElement.Load("File.xml");
var node = (from e in doc.Elements()
where (string)e.Attribute("Title") == "Despicable Me 2 (2013)"
select e).SingleOrDefault;
var like = (bool)node.Attribute("Like");
这是一种非常干净的方法。
XElement ele = XElement.Parse(movieXml);
string movie = "Despicable Me 2 (2013)";
string answer = ele.Descendants("Movie")
.Where(x => x.Attribute("Title").Value == movie)
.Select(x => x.Attribute("Like").Value)
.FirstOrDefault();
我稍微简化了您的XML,但想法是一样的。作为第一步,您可以构建一个满足标准的属性列表,然后选择第一个发现的元素。
const string myXml = @"<Critic-List>
<Movie Title='White House Down (2013)' Score='C+' />
<Movie Title='Despicable Me 2 (2013)' Score='A-' />
<Movie Title='World War Z (2013)' Score='B+' />
<Movie Title='Man of Steel (2013)' Score='B+' />
</Critic-List>";
var el = XElement.Parse(myXml);
var q1 = el.Elements()
.Select(n => (n.Attribute("Title").Value == "Despicable Me 2 (2013)") ? n.Attribute("Score") : null)
.First(n => n != null);