2011-11-14 24 views
3

我有這樣一個XML文件:如何使用XPathNavigator並返回不同的節點?

<Document> 
    <Tests> 
     <Test> 
     <Name>A</Name> 
     <Value>0.01</Value> 
     <Result>Pass</Result> 
     </Test> 
     <Test> 
     <Name>A</Name> 
     <Value>0.02</Value> 
     <Result>Pass</Result> 
     </Test> 
     <Test> 
     <Name>B</Name> 
     <Value>1.01</Value> 
     <Result>Fail</Result> 
     </Test> 
     <Test> 
     <Name>B</Name> 
     <Value>0.01</Value> 
     <Result>Pass</Result> 
     </Test> 
    </Tests> 
</Document> 

而一個類來保存每個測試數據:我使用這個代碼把所有的測試在一個List<TestData>

public class TestData 
{ 
    public string TestName {get; set;} 
    public int TestPositon {get; set;} //Position of Test node in XML file 
    public string TestValue {get; set;} 
    public string TestResult {get; set;} 
} 

現在

doc = new XPathDocument(filePath); 
nav = doc.CreateNavigator(); 

private List<TestData> GetAllTestData()  
{ 


    List<TestData> Datas = new List<TestData>(); 
    TestData testData; 

    XPathNodeIterator it = nav.Select("/Document/Tests/Test/Name"); 

    int pos = 1; 

    foreach(XPathNavigator val in it) 
    { 
     testData.TestPosition = pos; 
     testData = new TestData(); 
     // This adds the Name, but what should I change to access Value and Result 
     // in the same nav ?? 
     testData.TestName = val.Value; 
     Datas.Add(testData); 
     pos++; //Increment Position 
    } 

    return Datas; 
} 

所以正如我在評論中所說,XPath只是指Name節點,我怎樣才能在一個foreach中獲得所有3個節點對於傳教士?我的意思是如何分配這個東西:

testData.Value = ??? 
testData.Result = ??? 

謝謝!

回答

6

使用XPath

/Document/Tests/Test 

它選擇的測試節點。然後在foreach使用XPathNavigator.SelectSingleNode

foreach (XPathNavigator val in it) 
{ 
    testData = new TestData(); 
    testData.TestPosition = pos; 
    testData.TestName = val.SelectSingleNode(nav.Compile("Name")).Value; 
    testData.TestValue = val.SelectSingleNode(nav.Compile("Value")).Value; 
    Datas.Add(testData); 
    pos++; 
} 

或者使用XPath的:

/Document/Tests/Test/* 

它選擇的所有節點。

+0

對不起,我不清楚我的問題。我使用導航器的原因是,我還希望節點在XML文件中的位置。將使用你的代碼照顧positon以及?請檢查我更新的問題。 –

+0

@ Sean87,我已經更新了我的答案。 –

+0

你能告訴我應該如何用XPATH定義'/ Document/Tests/Test'嗎? –

1
XPathNodeIterator it = nav.Select("/Document[Tests/Test/Name]"); 

這將返回所有具有內部測試他們/測試/名稱

現在你可以肯定的是,如果您掃描文檔的文檔元素 - 你將有3個葉子。

相關問題