解析一个复杂嵌套的XML

问题描述:

我一直在阅读各种教程,但无法弄清楚有条件地解析下面的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

这应该工作:

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

我已经修改您的代码位。这将使你回到州府的国会大厦。

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