我try 按如下方式循环遍历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>

我的 idea 是把所有的信念代码,无论它是提议者还是驱动器,并将其存储在字符串列表中,然后通过发送一个索引,我执行ElementAtOrDefault来获得代码.

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

在这里,在GetConvictionCode方法中,我传递了Index个值和XHTML,后者调用GetConvictions方法,然后执行ElementAtOrDefault,得到基于索引的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

推荐答案

Solution 1

  1. 提供"/risk/proposer/consume/code"和"/risk/driver/consume/code".

  2. 使用InnerText而不是.SelectSingleNode("<path>").InnerText来获得值.

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

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

Solution 2

.SelectSingleNode("code")人合作.

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

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

Csharp相关问答推荐

总是丢弃返回的任务和使方法puc无效之间有区别吗?

使用特定格式的JsonConvert序列化对象

如何将Kafka消息时间戳转换为C#中的日期和时间格式?

使用两个不同的枚举作为Switch语句中的CASE生成唯一值

在ASP.NET Core Web API项目中通过中间件修改`Request.Path`不会更改使用的控制器/操作

使用泛型可空类实现接口

System.Text.Json .NET 8多形态语法化

依赖项注入、工厂方法和处置困境

.NET 8 DI GetServices<;对象&>不工作

在字符串C#之前获取数字

.NET 8在appsettings.json中核心使用词典URI、URI&>

JsonPath在Newtonsoft.Json';S实现中的赋值

从Base64转换为不同的字符串返回相同的结果

C#中类库项目的源代码生成器

工厂类是如何在.NET 8中注册的?

WPF如何获取有关从一个视图模型更改另一个视图模型的信息

使用SQL Server 2022+时,我是否必须将代码从SqlConnection类对象中迁移出来?

读取测试项目中的应用程序设置

使用ITfoxtec.Identity.Saml2解析相同键多值SAML 2声明

C#If条件格式