如何从XElement中检索元素

时间:2013-02-28 05:07:36

标签: c# linq linq-to-xml

我试图找出获得两个元素(City& State)值的最佳方法,以便我以后可以使用它们。我正在浏览网站下的每个网站。每次我通过它,我需要拉动城市和州,然后将它们保存为字符串。我有它的工作(有点),但我认为我以错误的方式解决这个问题。

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

1 个答案:

答案 0 :(得分: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的代码在包含它们的最内层循环中只有局部变量。这种方法提供了访问列表中所有值的机会。