C# Xml Parse SelectNodes

У меня есть следующий код 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>

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

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 анализирует все метрические значения. Что я должен сделать, чтобы решить эту проблему?

2 ответа

Решение

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

Ссылка на сводную таблицу синтаксиса: W3Schools - Синтаксис XPath

Вы можете использовать метод 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");
Другие вопросы по тегам