2017-08-02 11 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の州に細分された国しか持たないでしょうか?私は州を持たない(小さな)国に住んでおり、インターネット上の多くの住所入力フォームは、私が提供できない私の状態を求めています。そして、異なる国々に同じ名前の州がある場合、あなたは何を返そうとしていますか?私はそのような州が2つ存在するかどうかはわからないが、ソビエト連邦が独立国に分割される前は、ジョージアはソ連の国だったので可能である。 –

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

あなたはLOOP-

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

foreach (var state in statesCollection) 
{ 
    Messagebox.Show(state.Attribute("Capital").Value); 
} 
関連する問題