Возвращение потомков узла xml в виде списка <string>с использованием LINQ или XPATH - PullRequest
1 голос
/ 05 декабря 2011

У меня есть такой xml-файл

<Document>
   <Tests>
       <Test>
          <Name>A</Name>
          <Type>Like A</Type>
          <Members>
               <Member>1</Member>
               <Member>2</Member>
               <Member>3</Member>
          </Members>
       </Test>
       <Test>
          <Name>B</Name>
          <Type>Like B</Type>
          <Members>
               <Member>4</Member>
               <Member>5</Member>
               <Member>6</Member>
          </Members>
       </Test>
    </Tests>
</Document>

Теперь я создал класс для хранения данных для каждого тестового узла:

public class TestData
{
public string Name {get;set;}
public string Type {get;set;}

public List<string> Members = new List<string>();

public AddMembers(List<string> members)
{
Members.AddRange(members);
}
}

Сейчас я пытаюсь использовать xpath для заполнения моего класса TestData, но у меня возникают проблемы с добавлением членов в мой список. Я пытаюсь использовать LINQ, но пока не могу: (

   public List<TestClass> GetTests()
    {
        List<TestClass> tests = new List<TestClass>();
        TestClass test;

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

        foreach (XPathNavigator val in it)
        {
            test= new TestClass();
            test.Name = val.SelectSingleNode(nav.Compile("Name")).Value;
            test.Type = val.SelectSingleNode(nav.Compile("Type")).Value;
            test.AddMembers(); //How can I return all the member nodes in a list?

            tests.Add(test);
        }


        return tests ;
    }

Ответы [ 2 ]

3 голосов
/ 05 декабря 2011

Непонятно, зачем вы используете XPathNodeIterator, если честно.Если вы можете использовать LINQ to XML для этого, это действительно просто:

var list =  doc.Descendants("Test")
               .Select(x => TestClass.FromXElement(x))
               .ToList();

Где TestClass.FromXElement - это что-то вроде:

public static TestClass FromXElement(XElement element)
{
    string name = (string) element.Element("Name");
    string type  = (string) element.Element("Type");
    List<string> members = element.Descendants("Member")
                                  .Select(x => x.Value)
                                  .ToList();
    return new TestClass(name, type, members);
}

(вам не нужно использовать Descendants если вы более строго управляете иерархией. Например, в TestClass.FromXElement вы можете использовать element.Element("Members").Elements("Member")

1 голос
/ 05 декабря 2011

Попробуйте это:

IEnumerable<string> members =
  from m in ((IEnumerable<XmlNode>)((IHasXmlNode)val).GetNode()
                                                .SelectNodes("Members/Member"))
    select m.Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...