2013-07-20 46 views
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. 通过attribute-say属性(标题)=“卑鄙的我2(2013)”
  2. 选择一个节点,并从该选定的节点给出该节点的另一个属性值 - 例如:attribute(like)...(which在这种情况下将返回“真”)

在C#中的XML读者似乎对回归“内部文本”,而不是属性值更为适合,我想知道如果也许我应该存储在内部文本我的XML数据,而不是属性..对我来说将是非常检索属性的数据值更方便,但我不确定这些参数是否存在...

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

+0

你尝试过什么吗?如果是这样,请发布您尝试过的内容。 – Gjeltema

回答

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上获得一些教程。选项始终是扩大视野的好方法。

+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

您可以使用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"); 
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(); 
相关问题