2013-02-28 52 views
2

我想弄清楚获取两个元素(城市&状态)值的最佳方法,以便稍后使用它们。我正在循环浏览网站下的每个网站。每次我经历它时,我需要拉动城市和州,然后将它们保存为一个字符串。我有它的工作(种类),但我认为我正在做这个错误的方式。如何从XElement中检索元素

XML:

<Sites> 
    <Site> 
    <City>Miami</City> 
    <State>FL</State> 
    <Machines> 
     <Machine> 
     <MachineName>1950-16-CORE</MachineName> 
     <ServerRoleType>CoreServer</ServerRoleType> 
     <ClientRoles>Core</ClientRoles> 
     <Features> 
      <Feature> 
      <FeatureName>CoreProcess</FeatureName> 
      <FeatureEnabled>true</FeatureEnabled> 
      </Feature> 
      <Feature> 
      <FeatureName>Antivirus</FeatureName> 
      <FeatureEnabled>true</FeatureEnabled> 
      </Feature> 
     </Machine> 
     <Machine> 
     <MachineName>1950-16-COREX</MachineName> 
     <ServerRoleType>CoreExpansionServer</ServerRoleType> 
     <ClientRoles>CoreEx</ClientRoles> 
     <Features> 
      <Feature> 

代码:

foreach (XElement xEleSite in siteRows) 
{ 
    IEnumerable<XElement> siteLists = from siteList in xEleSite.Descendants("Site") 
             select siteList; 

    IEnumerable<XElement> siteCity = siteLists.Descendants("City"); 

    foreach (XElement c in siteCity) 
    { 
     string cityElement = c.Value.ToString(); 
    }  
} 

回答

2

考虑这个简单的例子:

<Sites> 
    <Site> 
    <City>Miami</City> 
    <State>FL</State> 
    <Machines></Machines> 
    </Site> 
    <Site> 
    <City>NY</City> 
    <State>FL</State> 
    <Machines></Machines> 
    </Site> 
</Sites> 

假设xEleSite包含此XML,现在你可以使用Anonymous Types保持信息:

var result = xEleSite.Descendants("Site") 
        .Select(s => new 
        { 
         City = s.Element("City").Value, 
         State = s.Element("State").Value 
        }); 

遍历它,您可以:

foreach (var i in result) 
{ 
    Console.WriteLine(i.City); 
    Console.WriteLine(i.State); 
    Console.WriteLine(); 
} 

从原来的问题,我想你需要所有的值存储在XML以后使用它,而OP的代码只有局部变量在包含它们的最内层循环中。这种方法提供了访问列表中所有值的机会。

+0

+1用于创建更简化的示例 – 2013-02-28 05:20:25