2011-11-11 75 views
1

我有這樣一個XML文件:如何訪問具有相同父項的不同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類似這樣的數據(ztr是實例XmlDocument我已經知道的Test的名字,我要讀,因爲它是populted到一個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,然後我的所有名稱複製到一個String []數組

而且我用這個代碼來閱讀所有一氣呵成:

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.我寫的所有代碼只是在這裏計算器...他們沒有編制,試想他們很好地工作:d

+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

而不是使用SelectSingleNode,改爲使用SelectNodes,我認爲你當前的xpath應該足夠了。您必須重新編寫GetTestData方法來處理遍歷XmlNodeList的迭代,以解析出正確的float值。

相關問題