按属性查找节点并返回不同的属性';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"/>

我该如何写一个

  1. 按属性选择节点-比如attribute(title)="Despicable Me 2(2013)"
  2. 并且从所选节点中为该节点的另一个属性提供值,例如:attribute(like)。。。(在这种情况下,返回"true")

C#中的XML阅读器似乎更倾向于返回"内部文本"而不是属性值,我想知道我是否应该将XML数据存储在内部文本而不是属性中。。对我来说,检索属性的数据值会方便得多,但我不确定这些参数是否存在。。。

如有任何帮助或建议阅读,我们将不胜感激!

按属性查找节点并返回不同的属性';s值

我不确定你想用什么方法来获得结果,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);