Как получить доступ к различным узлам XML, которые имеют одного и того же родителя? - PullRequest
1 голос
/ 11 ноября 2011

У меня есть 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, которое я собираюсь прочитать, поскольку оно было вставлено в 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 относится только к первому вхождению узла Test в файле XML.Я имею в виду, что давайте представим, что у меня есть ListView, который уже заполнен по имени всех Test узлов в моем XML-файле.в этом случае это выглядит примерно так:

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

Подскажите, пожалуйста, что я делаю не так?и как решить эту проблему?

PS Я написал все коды только здесь, в stackoverflow ... они не скомпилированы, просто представьте, что они работают нормально: D

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

Вместо того, чтобы использовать SelectSingleNode, используйте SelectNodes, вместо этого, ваш текущий xpath должен быть достаточным, я думаю.Вам придется переписать свой метод GetTestData для обработки итерации по XmlNodeList, чтобы проанализировать правильное значение float.

1 голос
/ 11 ноября 2011

Измените свой 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; 
    }
...