如何区分具有相同名称的不同后代?

时间:2010-03-19 12:51:54

标签: c# xml linq-to-xml

我有一些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>
     }
  }

如何设置我的代码以为每个&lt;创建RunDetails类的新实例?运行&gt;,并且只选择&lt;名称&gt;和&lt;日期和GT;在给定的&lt;运行&GT;

2 个答案:

答案 0 :(得分:3)

您可以使用LINQ to XML从XML创建IEnumerable。

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的类具有公共名称和日期(年份为int)属性。您可以按原样迭代可枚举,或者如果您需要更明确地访问各个成员,可以使用.ToList()或.ToArray()来转换查询。

答案 1 :(得分:1)

你的xml中需要有一些父元素,因为你的元素无效。如果您有以下xml

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

您可以将其加载到XDocument并遍历根元素的子元素。对于每个run子元素,您可以创建RunDetails