如何使用c#循环遍历xml文档节点以使用xpath存储值

问题描述 投票:0回答:1

我正在尝试循环下面的 xml 文档

<proposer driverId="1">
    <conviction convictionId="1">
      <code>16</code>
    </conviction>
    <conviction convictionId="2">
      <code>10</code>
    </conviction>
</proposer>
<driver driverId="2">
    <conviction convictionId="3">
      <code>22</code>
    </conviction>
</driver>

我的想法是获取所有信念代码,无论是提议者还是驱动程序,并将其存储在字符串列表中,然后通过发送索引,我执行 elementAtDefault 来获取代码

DrivingConvictionCode1 = GetConvictionCode(1, risk),
DrivingConvictionCode2 = GetConvictionCode(2, risk),
DrivingConvictionCode3 = GetConvictionCode(3, risk),

在 GetConvictionCode 方法中,我将索引值与 XmlDoc 一起传递,并调用 GetConvictions 方法,然后执行 Elementatdefault 以基于索引获取 ConvictionCode

private string GetConvictionCode(int convictionSrNo, XmlDocument risk)
{
    var convictions = GetConvictions(risk);
    return convictions.ElementAtOrDefault(convictionSrNo - 1) == null ? string.Empty : convictions[convictionSrNo - 1];
}

private List<string> GetConvictions(XmlDocument risk)
{
    var convictions = new List<string>();
    foreach (XmlNode selectNode in risk.SelectNodes("/risk/proposer/conviction"))
    {
        convictions.AddRange(new[] {selectNode.SelectSingleNode("/risk/proposer/conviction/code").InnerText});
    }
    foreach (XmlNode selectNode in risk.SelectNodes("/risk/driver/conviction"))
    {
        convictions.AddRange(new[] {selectNode.SelectSingleNode("/risk/driver/conviction/code").InnerText});
    }
    return convictions;
}

我在这里面临的问题是在循环中下一个信念值正在被旧的值取代,所以如果第一次循环它是 16 下一次它应该是 10 但它来了 16。任何人都可以帮忙或告诉我任何其他方式

我期望的输出是

DrivingConvictionCode1 = GetConvictionCode(1, risk) > 16,
DrivingConvictionCode2 = GetConvictionCode(2, risk) > 10,
DrivingConvictionCode3 = GetConvictionCode(3, risk) > 22,
c# asp.net xml xml-parsing xmldocument
1个回答
0
投票

您应该使用

InnerText
而不是
.SelectSingleNode("<path>").InnerText
来获取值。

foreach (XmlNode selectNode in risk.SelectNodes("/risk/proposer/conviction"))
{
    convictions.AddRange(new[] { selectNode.InnerText });
}

foreach (XmlNode selectNode in risk.SelectNodes("/risk/driver/conviction"))
{
    convictions.AddRange(new[] { selectNode.InnerText });
}
© www.soinside.com 2019 - 2024. All rights reserved.