2013-07-20 77 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(); 
相關問題