【问题标题】:Find a node by attribute and return a different attribute's value from that same node按属性查找节点并从同一节点返回不同属性的值
【发布时间】:2013-07-20 00:45:36
【问题描述】:

例如,我在 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 数据存储在内部文本中而不是属性中。对我来说这会更方便检索属性的数据值,但我不确定这些参数是否存在......

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

【问题讨论】:

  • 你有没有尝试过?如果是这样,请发布您尝试过的内容。

标签: c# xml xmlreader movies


【解决方案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 教程的好站点。选择永远是拓展视野的好方法。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我稍微简化了您的 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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多