2010-03-19 3 views
1

У меня есть XML, который я пытаюсь импортировать с C#, который выглядит примерно так:Как я могу различать разные потомки с тем же именем?

<root> 
<run> 
    <name = "bob"/> 
    <date = "1958"/> 
</run> 
<run> 
    <name = "alice"/> 
    <date = "1969"/> 
</run> 
</root> 

я загрузить мой XML с помощью

XElement xDoc=XElement.Load(filename); 

То, что я хочу сделать, это есть класс для «запуска», в соответствии с которым я могу хранить имена и даты:

public class RunDetails 
{ 
    public RunDetails(XElement xDoc, XNamespace xmlns) 
    { 
     var query = from c in xDoc.Descendants(xmlns + "run").Descendants(xmlns + "name") select c; 
     int i=0; 
     foreach (XElement a in query) 
     { 
      this.name= new NameStr(a, xmlns); // a class for names 
      Name.Add(this.name); //Name is a List<NameStr> 
      i++; 
     } 
     // Here, i=2, but what I want is a new instance of the RunDetails class for each <run> 
    } 
    } 

Как я могу настроить мой код, чтобы создать новый экземпляр класса RunDetails для каждого < запустить>, и только выбрать имя <> и < дата> внутри заданного пробега <>?

+0

это недопустимо XML ... –

ответ

3

Вы можете просто LINQ to XML создать IEnumerable из вашего XML.

IEnumerable<RunDetail> runDetails = from run in xdocument.Descendants("run") 
           select new RunDetail 
           { 
            Name = run.Element("name").Value, 
            Date = int.Parse(run.Element("date").Value) 
           }; 

Это, конечно, предполагает, что есть класс с именем RunDetail с публичным именем и датой (междунар за год) свойствами. Вы можете перебирать перечислимое как есть, или если вам нужен более явный доступ к отдельным членам, вы можете использовать .ToList() или .ToArray() для преобразования запроса.

+0

IEnumerable - это именно то, что мне нужно - приветствия :) – zotty

1

У вас должен быть какой-то родительский элемент в вашем xml, потому что ваш недопустимый. Если у вас есть следующий xml

<root> 
    <run> 
     <name = "bob"/> 
     <date = "1958"/> 
    </run> 
    <run> 
     <name = "alice"/> 
     <date = "1969"/> 
    </run> 
</root> 

Вы можете загрузить его в XDocument и выполнить итерацию через дочерние элементы корневого элемента. Для каждого дочернего элемента run вы можете создать RunDetails.

+0

Извинения, да, там есть корневой элемент - я опустил его, думая, что это сделает сообщение понятным. Как вы перебираете XDocument? Я использовал XElement, который, как я думал, был более удобным для пользователя. – zotty

+0

Вы можете использовать как XDocument, так и XElement. Обычно XDocument используется как root для XML-документа. –

Смежные вопросы