首页 > 解决方案 > 如何在 C# 中解析多个元素属性值

问题描述

我有以下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”。我怎样才能得到第二个值呢?我不需要循环,因为我知道那里只有 2 个值。

由于某些原因,LINQ 也不是一种选择。我怎样才能用 XDocument 实现它?

标签: c#xmlxml-parsing

解决方案


您可以稍微重写您的代码以获得预期的结果。使用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);
}

它打印SPRV.

如果你想使用基于索引的访问,没有循环,这可以帮助

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);

推荐阅读