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

本文关键字:XML 读取 数据 动态 to 使用 LINQ | 更新日期: 2023-09-27 18:14:44

我需要阅读XML文档看起来像下面的例子(简短版本)

<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到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开始。谢谢你

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

您可以将问题列表作为字典,以问题编号为键。问题号可以从节点名称中提取,使用substring从"n"在" Question…"中的位置之后开始。",例如:

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];