C# 如何访问具有相同父节点的不同XML节点?

C# 如何访问具有相同父节点的不同XML节点?,c#,xml,linq,xpath,xmldocument,C#,Xml,Linq,Xpath,Xmldocument,我有这样一个XML文件: <Document> <Tests> <Test> <Name>A</Name> <Value>1</Value> </Test> <Test> <Name>A</Name> <Value>2</Val

我有这样一个XML文件:

<Document>
   <Tests>
      <Test>
          <Name>A</Name>
          <Value>1</Value>
      </Test>
      <Test>
          <Name>A</Name>
          <Value>2</Value>
      </Test>
      <Test>
          <Name>B</Name>
          <Value>10</Value>
      </Test>
      <Test>
          <Name>B</Name>
          <Value>20</Value>
      </Test>
   </Tests>
</Document>
我使用XPATH读取数据,如下所示(
ztr
XmlDocument
的实例,我已经知道我将要读取的
Test
的名称,因为它已被填充到ListView中):

现在,问题是如果我想将数据列表设为
list
每个TestData只引用XML文件中第一个出现的Test节点。我的意思是让我们想象一下,我有一个ListView,它已经由xml文件中所有
Test
节点的名称填充。在这种情况下是这样的:

ListView=A,A,B,B
然后我将所有名称复制到字符串[]数组中

我用这段代码一次读完了所有的内容:

private List<TestData> GetAllData()
{
    List<TestData> Datas = new List<TestData>();
    TestData data;

    foreach(string test in stringOfNames)
    {
       data = new TestData;
       data = GetTestData(test);
       Datas.add(data);
    }

    return Datas
}
但我希望它像

Name     Value
A        1
A        2
B        10
B        20
你能告诉我我做错了什么吗?如何解决这个问题


另外,我在stackoverflow中编写了这里的所有代码……它们没有被编译,想象它们工作正常:D

修改您的
GetTestData()
方法(以及相应的调用方):


我认为,与其使用
SelectSingleNode
,不如使用当前的xpath。您必须重新编写
GetTestData
方法来处理通过
XmlNodeList
的迭代,以解析出正确的
float
值。

。。。你想要累计值吗?
private List<TestData> GetAllData()
{
    List<TestData> Datas = new List<TestData>();
    TestData data;

    foreach(string test in stringOfNames)
    {
       data = new TestData;
       data = GetTestData(test);
       Datas.add(data);
    }

    return Datas
}
Name     Value
A        1
A        1
B        10
B        10
Name     Value
A        1
A        2
B        10
B        20
    public TestData GetTestData(string testName, int pos) 
    { 
        TestData data = new TestData();            

        data.TestName = testName; 
        data.TestValue 
         = float.Parse(
ztr.SelectSingleNode("/Document/Tests/Test[Name = '" + testName + "')][" + pos + "]/Value").InnerText, CultureInfo.InvariantCulture); 

        return data; 
    }