【问题标题】:How to parse multiple element attribute values in C#如何在 C# 中解析多个元素属性值
【发布时间】:2020-05-05 07:06:20
【问题描述】:

我有下面的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# xml xml-parsing


    【解决方案1】:

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

    【讨论】:

    • 有没有办法将它分配给另一个变量,如 var Devtm[0] 或 var Devtm[1]?
    • @sensahin 我已经更新了基于索引访问的代码
    • 是否可以通过 foreach 循环使用索引访问?您提供的第一个解决方案?
    • 对不起,不明白为什么/这没有意义,您在使用索引访问特定元素的循环中逐个访问元素
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2017-09-14
    • 2013-05-06
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多