Как проанализировать значения атрибутов нескольких элементов в C# - PullRequest
1 голос
/ 18 января 2020

У меня ниже xml;

<Main>
    <Item ItemID="123456">
        <Devtm PL="SP"></Devtm>
        <Devtm PL="RV"></Devtm>
    </Item>
</Main>

Я пытаюсь получить все значения, принадлежащие элементу Devtm. Этот элемент может иметь несколько значений с атрибутом PL.

using (WebResponse response = request.GetResponse())
{
    using (StreamReader rd = new StreamReader(response.GetResponseStream()))
    {
        string soapResult = rd.ReadToEnd();
        var xdoc = XDocument.Parse(soapResult);
        var lineItemDetails = xdoc.Descendants("Main");

        foreach (var lineItemDetail in lineItemDetails)
        {
            var Devtm = lineItemDetail.Element("Item")?.Element("Devtm")?.Attribute("PL")?.Value;
            Console.WriteLine(Devtm);
        }
    }
}

Это только дает мне первое значение элемента, которое является "SP". Как я могу получить второе значение? Мне не нужно l oop, потому что я знаю, что там только 2 значения.

LINQ также не вариант по некоторым причинам. Как я могу добиться этого с XDocument?

1 Ответ

1 голос
/ 18 января 2020

Вы можете немного переписать свой код, чтобы получить ожидаемый результат. Используйте метод Descendants для доступа к элементу Item, а затем выполните итерации по его узлам

var lineItemDetails = xdoc.Root?.Descendants("Item");

foreach (var lineItemDetail in lineItemDetails?.Nodes().OfType<XElement>())
{
    var Devtm = lineItemDetail?.Attribute("PL")?.Value;
    Console.WriteLine(Devtm);
}

Он печатает SP и RV.

Если вы хотите использовать индексный доступ без l oop, это может помочь

var lineItemDetails = xdoc.Root?.DescendantsAndSelf("Item").FirstOrDefault();
var nodes = lineItemDetails?.DescendantNodes().OfType<XElement>().ToList();

Console.WriteLine(nodes?[0]?.Attribute("PL")?.Value);
Console.WriteLine(nodes?[1]?.Attribute("PL")?.Value);
...