【问题标题】:Loop through section without pulling all elements of the same name循环遍历部分而不拉取所有同名元素
【发布时间】:2018-10-12 19:28:31
【问题描述】:

尝试创建一个对象以循环访问该数据以提取服务器信息。不同节点中存在同名元素。以下是 XML 的示例。

<DataCenters>
  <DataCenter>
    <Name>DcName1</Name>
    <Clusters>
      <Cluster HAEnabled="False" DrsEnabled="True">
        <Name>Chicago</Name>
        <VMHosts>
          <VMHost>
            <Name>vm01.domain.com</Name>
          </VMHost>
          <VMHost>
            <Name>vm02.domain.com</Name>
          </VMHost>
        </VMHosts>
      </Cluster>
      <Cluster HAEnabled="True" DrsEnabled="True">
        <Name>Daytona</Name>
        <VMHosts>
          <VMHost>
            <Name>spa001.domain.com</Name>
          </VMHost>
          <VMHost>
            <Name>spa002.domain.com</Name>
          </VMHost>
        </VMHosts>
      </Cluster>
    </Clusters>
  </DataCenter>
  <DataCenter>
    <Name>DcName2</Name>
    <Clusters>
      <Cluster HAEnabled="True" DrsEnabled="True">
        <Name>Cleveland</Name>
        <VMHosts>
          <VMHost>
            <Name>vm20.domain.com</Name>
          </VMHost>
          <VMHost>
            <Name>vm21.domain.com</Name>
          </VMHost>
        </VMHosts>
      </Cluster>
      <Cluster HAEnabled="False" DrsEnabled="True">
        <Name>StLouis</Name>
        <VMHosts>
          <VMHost>
            <Name>vm07.domain.com</Name>
          </VMHost>
          <VMHost>
            <Name>vm08.domain.com</Name>
          </VMHost>
        </VMHosts>
      </Cluster>
    </Clusters>
  </DataCenter>
</DataCenters>
<VMHosts>
  <VMHost>
    <Name>spa001.domain.com</Name>
    <Version>6.0.0</Version>
    <Build>5572656</Build>
    <Manufacturer>Cisco Systems Inc</Manufacturer>
    <Model>UCSC-C240-M4SX</Model>
  </VMHost>
  <VMHost>
    <Name>spa002.domain.com</Name>
    <Version>6.0.0</Version>
    <Build>5572656</Build>
    <Manufacturer>Cisco Systems Inc</Manufacturer>
    <Model>UCSC-C240-M4SX</Model>
  </VMHost>
</VMHosts>

下面是我正在使用的代码。这会拉取所有 VMHost 元素。我试图留在 VMHosts 节点内。实现这一目标的最佳方法是什么?

  IEnumerable<XElement> vmHostsRows = from vmHostRows in XmlDoc.Descendants("VMHosts")
                                      select vmHostRows;

  IEnumerable<XElement> vmHostLists = from vmHostList in vmHostsRows.Descendants("VMHost")
                                      select vmHostList;

  foreach (XElement vHosts in vmHostLists)
  {
      MessageBox.Show(vHosts.Element("Name").Value.ToString());
  }

【问题讨论】:

  • “样本”不是有效的 XML。
  • 这是一个输出示例。我有几十个这样的。
  • 发布时无效。

标签: c# linq linq-to-xml


【解决方案1】:

它返回所有VMHosts 元素的原因是因为您使用的是Descendants。此方法返回与名称匹配的 any 元素,无论它在 xml 中的什么位置。 您应该改用Elements,因为这将只返回您调用它的元素的直接子元素。在您的情况下,您应该在 xml 的根元素上调用它(我假设您的 xml 有一个您没有显示的根元素):

IEnumerable<XElement> vmHostLists = XmlDoc.Root.Element("VMHosts").Elements("VMHost");
foreach (XElement vHosts in vmHostLists)
{
    MessageBox.Show(vHosts.Element("Name").Value.ToString());
}  

【讨论】:

  • 这正是我被难住的地方。谢谢你的解释。
  • 很高兴能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2015-07-24
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多