按属性查找节点,并从该节点返回不同属性的值

时间:2013-07-20 00:45:36

标签: c# xml xmlreader movies

我在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. 按属性选择节点 - 比如属性(标题)=&#34;卑鄙的我2(2013)&#34;
  2. 并从该选定节点给出该节点的另一个属性的值 - 例如:attribute(like)...(在这种情况下将返回&#34; true&#34;)
  3. C#中的XML阅读器似乎更倾向于返回&#34;内部文本&#34;我想知道是否应该将我的xml数据存储在内部文本而不是属性中,而不是属性值。对我来说,检索属性的数据值会更方便,但是我是不确定这些参数是否存在......

    任何帮助或建议的阅读将非常感谢!

4 个答案:

答案 0 :(得分:1)

我简化了你的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);

答案 1 :(得分:1)

您可以像这样使用LINQ to 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");

答案 2 :(得分:1)

这是一种非常干净的方式。

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();

答案 3 :(得分:1)

我不确定你尝试使用什么方法来获得结果,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的一些教程。选项始终是扩展视野的好方法。