2017-08-02 118 views
0

我一直在閱讀各種教程,但無法弄清楚有條件地解析下面的XML結構,其中用戶輸入一個國家的名稱,然後收到國會大廈的名稱。解析一個複雜嵌套的XML

當我用下面的代碼測試它時,我沒有彈出MessageBox。

C#代碼

XDocument xd = XDocument.Load("Foo.xml"); 

foreach (var state in xd.Descendants("State")) 
{ 
     Messagebox.Show(state.Attribute("Name").Value); 
} 

Foo.xml

<Main> 
    <Title></Title> 
    <Planet Name="Earth"> 
     <Continent Name="North America"> 
     <Country Name="USA"> 
      <State Name="Illinois" Capital="Springfield"></State> 
      <State Name="Alabama" Capital="Montgomery"></State> 
      ... 
     </Country> 
     <Country Name="Canada"> 
      <State Name="Alberta" Capital="Edmonton"></State> 
      <State Name="British Columbia" Capital="Victoria"></State> 
      <State Name="Manitoba" Capital="Winnipeg"></State> 
      .... 
     </Country> 
     <Country> ... </Country> 
     <Country> ... </Country> 
     <Country> ... </Country> 
     </Continent> 
    </Planet> 
</Main> 
+1

名稱是否缺少在LINQ where子句? – Hybridzz

+0

您是否只有在XML中被細分爲國家的國家?我住在一個沒有國家和許多互聯網上的地址輸入表格的(小)國家要求我不能提供的國家。當不同的國家擁有同名的國家時,你想要返回什麼?我不知道是否存在兩個這樣的國家,但在蘇聯分裂成獨立國家之前,格魯吉亞是蘇聯的一個國家,所以這是可能的。 –

+0

@Hybridzz:我編輯了我的測試代碼,使其更簡單。 – KMC

回答

1

這應該工作:

List<State> states = (from s in XDocument.Load(@"Foo.xml").Descendants("State") 
    select new State 
    { 
     Name = s.Attribute("Name").Value, 
     Capital = s.Attribute("Capital").Value 
    }).ToList(); 

foreach (State state in states) 
{ 
    //do something... 
} 

//Or get a specific state 
var alabama = states.FirstOrDefault(a => a.Name == "Alabama"); 
1

我已經修改您的代碼位。這將使你回到州府的國會大廈。

var stateCapital = from states in XDocument.Load(@"foo.xml").Descendants("State") 
        where states.Attribute("Name").Value == "Alabama" 
        select states.Attribute("Capital").Value; 

Messagebox.Show(stateCapital); 

如果你需要的所有資本的每一個國家在爲環 -

var statesCollection = from states in XDocument.Load(@"foo.xml").Descendants("State") select states; 

foreach (var state in statesCollection) 
{ 
    Messagebox.Show(state.Attribute("Capital").Value); 
}