循环遍历部分而不拉取所有同名元素
Loop through section without pulling all elements of the same name
正在尝试创建一个对象来循环访问该数据以提取服务器信息。不同节点中存在同名元素。下面是 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());
}
之所以 return 包含所有 VMHosts
元素,是因为您正在使用 Descendants
。此方法 returns 任何 匹配名称的元素,无论它在 xml 中的哪个位置。
您应该改用 Elements
,因为这只会 return 您调用它的元素的直接子元素。在你的情况下,你应该在你的 xml 的根元素上调用它(我假设你的 xml 有一个你没有显示的根元素):
IEnumerable<XElement> vmHostLists = XmlDoc.Root.Element("VMHosts").Elements("VMHost");
foreach (XElement vHosts in vmHostLists)
{
MessageBox.Show(vHosts.Element("Name").Value.ToString());
}
正在尝试创建一个对象来循环访问该数据以提取服务器信息。不同节点中存在同名元素。下面是 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());
}
之所以 return 包含所有 VMHosts
元素,是因为您正在使用 Descendants
。此方法 returns 任何 匹配名称的元素,无论它在 xml 中的哪个位置。
您应该改用 Elements
,因为这只会 return 您调用它的元素的直接子元素。在你的情况下,你应该在你的 xml 的根元素上调用它(我假设你的 xml 有一个你没有显示的根元素):
IEnumerable<XElement> vmHostLists = XmlDoc.Root.Element("VMHosts").Elements("VMHost");
foreach (XElement vHosts in vmHostLists)
{
MessageBox.Show(vHosts.Element("Name").Value.ToString());
}