解析复杂嵌套 XML

Parsing a complexly nested 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>

这应该有效:

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

我稍微修改了你的代码。这将 return 你从国家的国会大厦。

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

如果您需要 for 循环中每个州的所有首都的名称-

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

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