0

例如,我在 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. 通过属性选择一个节点-say attribute(title)="Despicable Me 2 (2013)"
  2. 并从该选定节点给出该节点的另一个属性的值 - 例如:attribute(like)...(在这种情况下将返回“true”)

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

任何帮助或建议阅读将不胜感激!

4

4 回答 4

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");
于 2013-07-20T01:13:22.947 回答
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();
于 2013-07-20T01:16:13.600 回答
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 教程的好站点。选择永远是扩展视野的好方法。

于 2013-07-20T01:43:25.737 回答
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);
于 2013-07-20T01:05:54.407 回答