使用LINQ to XML从XML动态读取数据

时间:2014-07-24 16:32:22

标签: c# linq linq-to-xml

我需要阅读XML doc,如下面的示例(简短版本)

<root>
 <data>
    <_0>
        <id>123</id>
        <status>complete</status>
        <datesubmitted>2014-07-07 10:35:45</datesubmitted>
        <question1>10</question1>
        <question2>Yes</question2>
        <question3></question3>
    </_0>
    <_1>
        <id>456</id>
        <status>complete</status>
        <datesubmitted>2014-07-07 11:05:45</datesubmitted>
        <question1>10</question1>
        <question2>Yes</question2>
        <question3></question3>
    </_1>
    <_2>
        <id>789</id>
        <status>complete</status>
        <datesubmitted>2014-07-07 12:15:45</datesubmitted>
        <question1>10</question1>
        <question2>Yes</question2>
        <question3></question3>
    </_2>
 </data>
</root>

通过使用此处发布的建议,我使用的是LINQ to XML

XElement root = XElement.Load(@"c:\\Temp\\SurveyResponse.xml");

var data = from child in root.Elements("data").Elements()
                   select new
                   {
                       id = (int)child.Element("id"),
                       status = (string)child.Element("status"),
                       date = (string)child.Element("datesubmitted")

                   };

我有两个问题 如何在LINQ查询语句中不对其进行硬编码来提取问题

 question1 = (string)child.Element("question1"),
 question2 = (string)child.Element("question2"),
 question3 = (string)child.Element("question3"),

我需要有能力构建一些问题集合,其中的问题将使用正确的索引进行提取。注意:问题全部整理出来但不一定从1开始。谢谢

1 个答案:

答案 0 :(得分:1)

您可以将问题列表作为字典,问题编号为关键字。可以使用substring从“问题... ”中的“ n ”位置开始,从节点名称中提取问题编号,例如:

var data = from child in doc.Root.Elements("data").Elements()
           select new
           {
               id = (int)child.Element("id"),
               status = (string)child.Element("status"),
               date = (string)child.Element("datesubmitted"),
               questions = child.Elements()
                                .Where(o => o.Name.LocalName.StartsWith("question"))
                                .ToDictionary(t => int.Parse(t.Name.LocalName.Substring(8)), 
                                              t => (string)t)
           };

这样你可以通过它的数字/索引得到任何问题,例如:

var data1 = data.FirstOrDefault();
var question2 = data1.questions[2];