2014-03-03 44 views
0

我在這裏嘗試從具有2個不同後代的xml文件中提取數據時遇到了一些問題。LINQ從2個不同的XML後裔中選擇特定數據

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Male> 
    <Person id="1" Name="Joe" Age="35" /> 
      ...... Some more data 
    <Person id="6" Name="Hank" Age="55" /> 
</Male> 

<Female> 
    <Person id="4" Name="Jane" Age="28" /> 
    ...... Some more data 
    <Person id="9" Name="Jude" Age="32" /> 
</Female> 

所以我想提取後裔女只,所以這裏是我的代碼。

private int personId; 
private string personName; 
private int personAge 

private async void GetPersonDetails() 
{ 
    try 
     { 
     string personDetail = "http://localhost/people/directory.xml"; 
     HttpClient httpClient = new HttpClient(); 
     HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, personDetail 

     // Send the request to the server 
     HttpResponseMessage response2 = await httpClient.SendAsync(requestMessage); 

     // Just as an example I'm turning the response into a string here 
     string responseAsString = await response2.Content.ReadAsStringAsync(); 

     System.Xml.Linq.XDocument _xdoc = System.Xml.Linq.XDocument.Parse(responseAsString); 

var peopleData = from person in _xdoc.Descendants("Female") 
    select new 
    { 
     id = person.Attribute("id").Value, 
     name = person.Attribute("Name").Value, 
     age = person.Attribute("Age").Value  
    }; 

int peopleIdx = 0; 
foreach (var pDetails in peopleData) 
{ 
    personId = pDetails.id; 
    personName = pDetails.name; 
    personAge = pDetails.age; 
    peopleIdx++; 
} 


     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message.ToString()); 
     } 

    } 

什麼情況是它也提取男性的細節。我怎麼能做到這一點,以獲得女性後代的所有數據?基本上用戶可以搜索男性或女性來獲得結果。

+1

這是一個無效的XML文件。 XML必須有一個根;樣本中有2根。 –

+0

與Metro Smurf指出的問題一樣,您提供的代碼根本不會提取這些值,因爲它在查找名爲「id」,「Name」和「Age」的*屬性*實際上有元素。噢,你正在用一個'person'結束元素關閉一個Person元素。當我們不知道*真實*數據是什麼樣子(或者可能是您的真實代碼)時,很難爲您提供幫助。 –

+0

@JonSkeet我更新了我用來真正從我的xml文件中提取數據的源代碼。如果它只有一個根,那麼我沒有問題拉取數據。那麼你和Metro Smurf建議我應該改變xml格式? – Osirus

回答

1

您需要選擇一個名爲Person這是Female子元素。您可以使用Enumerable.SelectMany()獲得Female元素的孩子,然後處理自己的數據:

var people = _xdoc.Descendants("Female") 
    .SelectMany(e => e.Descendants("Person")) 
    .Select(e => new 
    { 
     Id = e.Attribute("id").Value, 
     Name = e.Attribute("Name").Value, 
     Age = e.Attribute("Age").Value 
    }); 
+0

非常感謝!這就是我一直在尋找的東西。非常感謝您的幫助。 – Osirus

+2

這裏你不需要'SelectMany' - 只是'_xdoc.Descendants(「女」)。後代(「Person」)很好。 –