Как использовать XPathNavigator и вернуть разные узлы? - PullRequest
3 голосов
/ 14 ноября 2011

У меня есть XML-файл, подобный следующему:

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

И класс для хранения данных для каждого теста:

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

Теперь я использую этот код для помещения всех тестов вList<TestData>

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 для itterator?Я имею в виду, как назначить эти вещи, а также:

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

Спасибо!

Ответы [ 2 ]

7 голосов
/ 14 ноября 2011

Использовать 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/*

Выбирает все узлы.

1 голос
/ 14 ноября 2011
 XPathNodeIterator it = nav.Select("/Document[Tests/Test/Name]");

это вернет вам все элементы документа, в которых есть Tests / Test / Name внутри

теперь вы можете быть уверены, что если вы отсканируете документ - у вас будет 3 листа.

...