C# 用C LINQ提取XML的细节记录

C# 用C LINQ提取XML的细节记录,c#,xml,linq,C#,Xml,Linq,我有以下XML摘录。提取XML的第一步没有问题,但我不知道如何进入第二层并提取每一层。具体来说,下面是XML中的用户信息 任何帮助都将不胜感激 <?xml version="1.0" encoding="UTF-8" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:getStatusReportResponse xml

我有以下XML摘录。提取XML的第一步没有问题,但我不知道如何进入第二层并提取每一层。具体来说,下面是XML中的用户信息

任何帮助都将不胜感激

<?xml version="1.0" encoding="UTF-8" ?> 
  <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
    <ns2:getStatusReportResponse xmlns:ns2="http://xxxxxxxxx.com/">
      <return>
        <statusReport>
        <record>
          <assessorDate /> 
          <assessorOffice /> 
          <availableDate /> 
          <awardDate>01/01/2014</awardDate> 
          <awardValue>1000000</awardValue> 
              <businessSector>SYSTEMS</businessSector> 
          <user>
            <accessGrantedDate /> 
            <emailAddress>john.usda@noemail.mil</emailAddress> 
            <name>JOHN USDA</name> 
            <phoneNumber>XXX-XXX-XXXX</phoneNumber> 
            <role>Focal Point</role> 
          </user>
          <user>
            <accessGrantedDate /> 
            <emailAddress>john.usda@noemail.mil</emailAddress> 
            <name>JOHN USDA</name> 
            <phoneNumber>XXX-XXX-XXXX</phoneNumber> 
            <role>Focal Point</role> 
          </user>
        </record>
       </statusReport>
      </return>
    </ns2:getStatusReportResponse>
    </S:Body>
  </S:Envelope>
我已经试过了,但它只给我一个第一个用户记录的列表,而不是所有的

var records = from x in xml.Descendants("record")
              select new
              {
                  awardDate = (string) x.Descendants("awardDate").FirstOrDefault().Value
                  ,userList = (List<string>) x.Descendants("user").Elements()                                                                //.Elements("accessGrantedDate")
                                                                  .Select(a => a.Value).ToList()
              };

据我所知,您的代码获取文件中所有用户的数据,但仅获取节点的值

更具组织性的方法是:

class User
    {
        public string accessGrantedDate { get; set; }
        public string emailAddress { get; set; }
        public string name { get; set; }       
        public string phoneNumber { get; set; }
        public string role { get; set; }       
    }
然后:

或者,如果您不想以这种方式组织数据,可以使用列表列表:

 var records = from x in xml.Descendants("record")
        select new
        {
            awardDate = (string)x.Descendants("awardDate").FirstOrDefault().Value,
            userList = x.Descendants("user").Select(a => a.Elements().Select(b=>b.Value).ToList()).ToList()
        };

我假设这是您的用户类的模型:

这是从XML中提取用户类:

var records = from x in xml.Descendants("record")
              select new
              {
                 AwardDate = (string)x.Element("awardDate"),
                 UserList = x.Descendants("user").Select(user => new User 
                 {
                    AccessGrantedDate = string.IsNullOrEmpty((string)user.Element("accessGrantedDate")) ? 
                                        (DateTime?) null : DateTime.Parse((string)user.Element("accessGrantedDate")),
                    EMailAddress = (string)user.Element("emailAddress"),
                    Name = (string)user.Element("name"),
                    PhoneNumber = (string)user.Element("phoneNumber"),
                    Role = (string)user.Element("role")
                 })
              };

我通过第二次查询细节记录解决了这个问题,因此,在外部列表中创建了一个列表作为对象

        var records = from x in xml.Descendants("record")
                      select new
                      {
                          awardDate = x.Element("awardDate")
                          ,
                          userList = from u in x.Descendants("user")
                                     select new
                                       {
                                           accessGrantedDate = (string) u.Element("accessGrantedDate")
                                           ,emailAddress =(string) u.Element("emailAddress"
                                           ,name = (string) u.Element("name")
                                           ,phoneNumber = (string) u.Element("phoneNumber")
                                           ,role = (string) u.Element("role")
                                       }
                      };

您想要完整的记录还是只想要用户节点?我的目标是获得每个记录的详细信息,以便我可以将其绑定到父记录。您确定要的是列表吗?为什么不列个清单呢?啊。因此,创建一个用户类。那正是我想要的。对不起,我是一名SQL开发人员,只写了一小部分C。如果我将列表更改为列表,我的逻辑会工作吗?谢谢你的帮助。我使用了你给我的列表想法,实际上在列表中创建了一个列表来解决这个问题。我将您标记为已解决,因为我确信您的解决方案是有效的,并且您将我送到了提出我的解决方案的方向。您使用后代的迭代在这里是多余的。可以使用element方法访问每个元素。
var records = from x in xml.Descendants("record")
              select new
              {
                 AwardDate = (string)x.Element("awardDate"),
                 UserList = x.Descendants("user").Select(user => new User 
                 {
                    AccessGrantedDate = string.IsNullOrEmpty((string)user.Element("accessGrantedDate")) ? 
                                        (DateTime?) null : DateTime.Parse((string)user.Element("accessGrantedDate")),
                    EMailAddress = (string)user.Element("emailAddress"),
                    Name = (string)user.Element("name"),
                    PhoneNumber = (string)user.Element("phoneNumber"),
                    Role = (string)user.Element("role")
                 })
              };
        var records = from x in xml.Descendants("record")
                      select new
                      {
                          awardDate = x.Element("awardDate")
                          ,
                          userList = from u in x.Descendants("user")
                                     select new
                                       {
                                           accessGrantedDate = (string) u.Element("accessGrantedDate")
                                           ,emailAddress =(string) u.Element("emailAddress"
                                           ,name = (string) u.Element("name")
                                           ,phoneNumber = (string) u.Element("phoneNumber")
                                           ,role = (string) u.Element("role")
                                       }
                      };