2011-11-14 8 views
3

私はこのようなXMLファイルを持っている:今、私はList<TestData>XPathNavigatorを使用して異なるノードを返す方法

内のすべてのテストのを置くために、このコードを使用しています

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

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

そして、それぞれのテストのためのデータを保持するクラスを

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ノードを参照するだけです。どのノードを3つのforeachイテレータのために?私はこのことをどのように割り当てるかを意味します:

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葉を持っていますが。

関連する問題