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

时间:2011-11-11 15:02:16

标签: c# xml linq xpath xmldocument

我有一个像这样的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>

我创建了一个类来保存每个Test节点的数据:

public class TestData
{
public string TestName {get; set;}
public float TestValue {get; set;}
}

我使用像这样的XPATH读取数据(ztrXmlDocument的实例我已经知道我将要阅读的Test的名称,因为它被填充到了ListView的):

    public TestData GetTestData(string testName)
    {
        TestData data = new TestData();           

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

        return data;
    }

现在,问题是,如果我想将数据列表设为List<TestData>,则每个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
}

正如我告诉你的那样这段代码没有区分不同的Test。它只返回Test的第一次出现,因此GetAllData()的结果将为:

Name     Value
A        1
A        1
B        10
B        10

但我希望它像

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

P.S。我在stackoverflow中编写了所有代码......它们没有编译,只是想象它们工作正常:D

2 个答案:

答案 0 :(得分:1)

修改您的GetTestData()方法(及其来电者):

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

答案 1 :(得分:1)

而不是使用SelectSingleNode,而是使用SelectNodes代替,我认为您当前的xpath应该足够了。您必须重新编写GetTestData方法来处理迭代XmlNodeList以解析出正确的float值。