2014-09-29 59 views
0

我有以下XML摘錄。我沒有任何問題提取XML的第一步,但我無法弄清楚如何到達第二層並提取每一層。具體來說,下面的XML中的用戶信息。通過C#提取XML的詳細記錄LINQ

任何幫助將不勝感激...

<?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>[email protected]</emailAddress> 
      <name>JOHN USDA</name> 
      <phoneNumber>XXX-XXX-XXXX</phoneNumber> 
      <role>Focal Point</role> 
      </user> 
      <user> 
      <accessGrantedDate /> 
      <emailAddress>[email protected]</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() 
       }; 
+0

你想要完整的記錄還是隻有用戶節點? – 2014-09-29 12:52:54

+0

我的目標是獲得每條記錄的詳細信息,我可以將其與父母聯繫起來。 – KeithL 2014-09-29 12:55:59

+0

你確定有一個'List '是你想要的嗎?爲什麼不是'名單'? – 2014-09-29 12:56:58

回答

0

我假定這是您的User類的模型:

public class User 
{ 
    public DateTime? AccessGrantedDate { get; set; } 
    public string EMailAddress { get; set; } 
    public string Name { get; set; } 
    public string PhoneNumber { get; set; } 
    public string Role { get; set; } 
} 

,這是從XML提取User類:

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") 
       }) 
       }; 
0

據我所知,您的代碼獲取文件中所有用戶的數據,但僅獲取節點的值。

更有條理的方式來做到這一點是:

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=>new User 
        { 
         accessGrantedDate= a.Element("accessGrantedDate").Value, 
         emailAddress=a.Element("emailAddress").Value, 
         name=a.Element("name").Value, 
         phoneNumber=a.Element("phoneNumber").Value, 
         role = a.Element("role").Value 
        }).ToList() 
       }; 

,或者,如果你不想組織數據這種方式,你可以使用一個列表名單:

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() 
     }; 
0

我通過查看詳細記錄的第二查詢,因此,創建一個列表作爲外部列表內的對象解決了這個問題。

 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") 
             } 
         }; 
+0

這裏使用'Descendants'進行迭代是多餘的。您可以使用Element()方法訪問每個元素。 – 2014-09-29 17:58:30