Как мне различать разных потомков с одинаковыми именами? - PullRequest
1 голос
/ 19 марта 2010

У меня есть какой-то XML, который я пытаюсь импортировать с помощью c #, который выглядит примерно так:

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

Я загружаю xml, используя

XElement xDoc=XElement.Load(filename);

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

 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 для каждого и для выбора только и внутри данного ?

Ответы [ 2 ]

3 голосов
/ 19 марта 2010

Вы можете просто 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 с открытыми свойствами Name и Date (int для года). Вы можете перебирать перечисляемое как оно есть, или, если вам нужен более явный доступ к отдельным членам, вы можете использовать .ToList () или .ToArray () для преобразования запроса.

1 голос
/ 19 марта 2010

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

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

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

...