2014-09-04 2 views
0

У меня есть следующий код XML:C# Xml Анализировать SelectNodes

<Start> 
     <MetricValue> 
        <Name>Name1</Name> 
        <Value>1</Value> 
     </MetricValue> 
     <MetricValue> 
        <Name>Name1</Name> 
        <Value>1</Value> 
     </MetricValue> 
     <Test> 
      <MetricValue> 
          <Name>Name1</Name> 
          <Value>1</Value> 
      </MetricValue> 
      <MetricValue> 
          <Name>Name1</Name> 
          <Value>1</Value> 
      </MetricValue> 
     </Test> 
</Start> 

Я пытаюсь разобрать только первые 2 значения метрики и не то, что из между тегами «Test».

XmlNodeList nlMetricValues = xmlDoc.SelectNodes("//Start//MetricValue"); 
foreach (XmlNode nMetricValue in nlMetricValues) 
{ 
     Console.WriteLine("\Name: " + nMetricValue.SelectSingleNode(".//Name").InnerText); 
     Console.WriteLine("\tValue: " + nMetricValue.SelectSingleNode(".//Value")).InnerText); 
} 

Но этот foreach анализирует все значения метрики. Что я должен сделать, чтобы решить эту проблему?

+0

Пожалуйста, добавьте XPath используются для выбора MetricValue узлов, как это, где проблема вероятно. – toadflakz

+0

Готово. Я добавил xmlnode слишком –

ответ

0

Ваш XPath должен быть "./Start/MetricValue", так как "//" означает, что он будет искать дерево узлов для любого соответствия ниже предыдущего узла.

Ссылка на синтаксис Cheatsheet: W3Schools - XPath Syntax

+0

спасибо. работает :) –

0

Вы можете использовать метод Elements() из XElement класса. Она будет загружать только MetricValue элементы, которые являются детьми Start элемента:

var xml = @" 
<Start> 
    <MetricValue> 
     <Name>Name1</Name> 
     <Value>1</Value> 
    </MetricValue> 
    <MetricValue> 
     <Name>Name1</Name> 
     <Value>1</Value> 
    </MetricValue> 
    <Test> 
     <MetricValue> 
      <Name>Name1</Name> 
      <Value>1</Value> 
     </MetricValue> 
     <MetricValue> 
      <Name>Name1</Name> 
      <Value>1</Value> 
     </MetricValue> 
    </Test> 
</Start>"; 

var metricValues = XElement.Parse(xml).Elements("MetricValue"); 
+0

Не должно быть 'XElement.Parse (xml) .Element (« Start »). Элементы (« MetricValue »);'? – toadflakz

+0

@toadflakz, нет, не совсем. Корневой элемент здесь - «Пуск», поэтому вам не нужен другой вызов метода «Элемент()». – RePierre

+0

Справа вы - я обычно всегда использовал 'XDocument.Parse()' и нуждался бы в дополнительном вызове 'Element()', поэтому я его запросил - очевидно, 'XElement.Parse()' возвращает 'XElement', а не 'XDocument'! К сожалению! – toadflakz