2013-07-20 3 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. выбирает узел атрибутом атрибут-say (title) = «Despicable Me 2 (2013)»
  2. и с этого выбранного узла дает значение для другого атрибута этого узла - например: attribute (like) ... (который в этом случае вернется «истина»)

XML-читатели в C#, похоже, больше ориентированы на возвращение «внутреннего текста», а не значений атрибутов. Мне интересно, возможно, я должен был хранить мои XML-данные во внутреннем тексте, а не в атрибутах .. мне было бы много более удобно извлекать значения данных атрибутов, но я не уверен, существуют ли эти параметры ...

любая помощь или предлагаемое чтение были бы высоко оценены!

+0

Вы пробовали что-нибудь? Если да, напишите, что вы пробовали. – Gjeltema

ответ

1

Я не уверен, какой метод вы пытаетесь использовать, чтобы получить результат, LINQ к 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();