解析一个复杂嵌套的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>
答
这应该工作:
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);
}
名称是否缺少在LINQ where子句? – Hybridzz
您是否只有在XML中被细分为国家的国家?我住在一个没有国家和许多互联网上的地址输入表格的(小)国家要求我不能提供的国家。当不同的国家拥有同名的国家时,你想要返回什么?我不知道是否存在两个这样的国家,但在苏联分裂成独立国家之前,格鲁吉亚是苏联的一个国家,所以这是可能的。 –
@Hybridzz:我编辑了我的测试代码,使其更简单。 – KMC