2014-01-22 29 views
0

我想用xml源文件構建對象。 我需要獲得與特定「SiteName」匹配的「網站」元素。 然後用'Site'元素中的所有元素構建我的對象(LocalisationInfo類)。 謝謝。LinqToXml使用xml文件構造類對象

這裏是XML文件的樣子:

<Sites> 
    <Site> 
     <longitude>1.555</longitude> 
     <latitude>4.488003</latitude> 
     <SiteName>Aix en Provence</SiteName> 
     <FullAdresse>adresse here</FullAdresse> 
     <NomResponsable>martin Véronique</NomResponsable> 
     <AdressePostale>260 rue Louis de Broglie</AdressePostale> 
     <CodePostal>13799</CodePostal> 
     <Ville>Aix-En-Provence</Ville> 
     <Pays>France</Pays> 
    </Site> 

    <Site> 
    </Site> 
    <Site> 
    </Site> 

這裏是我的代碼是不工作...

XDocument xdoc = XDocument.Load("Resources/Sites.xml"); 

      var lesite = from d in xdoc.Descendants("Site")   
         where d.Element("SiteName").Value == sitelocalisation 
         select new LocalisationInfo 
      { 
       TelSecouriste = d.Element("TelSecouriste").Value, 
       Longitude = d.Element("longitude").Value, 
       Latitude = d.Element("latitude").Value, 
       Pays = d.Element("Pays").Value, 
       CodePostal = d.Element("CodePostal").Value, 
       Ville = d.Element("Ville").Value, 
       Standard = d.Element("Standard").Value, 
       SiteName = d.Element("SiteName").Value, 
       AdressePostale = d.Element("AdressePostale").Value, 

      }; 
+0

究竟是什麼不工作?你有例外嗎? –

回答

1

我可以假設你有一些Site元件,而不SiteName孩子,或者在匹配的網站上沒有其他元素。因此,您正在訪問元素的Value屬性,那麼如果找不到某個元素,您將收到NullReferenceException。使用鑄造字符串,而不是 - 它返回null而不是提高例外:

XDocument xdoc = XDocument.Load("Resources/Sites.xml"); 

var lesite = from s in xdoc.Root.Elements("Site")   
      where (string)s.Element("SiteName") == sitelocalisation 
      select new LocalisationInfo { 
       TelSecouriste = (string)s.Element("TelSecouriste"), 
       Longitude = (string)s.Element("longitude"), 
       Latitude = (string)s.Element("latitude"), 
       Pays = (string)s.Element("Pays"), 
       CodePostal = (string)s.Element("CodePostal"), 
       Ville = (string)s.Element("Ville"), 
       Standard = (string)s.Element("Standard"), 
       SiteName = (string)s.Element("SiteName"), 
       AdressePostale = (string)s.Element("AdressePostale"), 
      }; 

請記住,這個查詢將返回相匹配的地點順序。因此,如果您只需要第一個,則使用FirstOrDefault

var result = lesite.FirstOrDefault(); 
+1

+1,但你知道他們對假設是正確的嗎? :) – Alex

+0

@Alex謝謝!它會很有趣,如果錯誤看起來像'FileNotFoundException' :) –

+0

你可以只覺得它會是這樣的:D – Alex