C# 循环通过节,而不拉动同名的所有元素
试图创建一个对象来循环该数据以获取服务器信息。不同节点中存在同名元素。下面是一个XML示例C# 循环通过节,而不拉动同名的所有元素,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,试图创建一个对象来循环该数据以获取服务器信息。不同节点中存在同名元素。下面是一个XML示例 <DataCenters> <DataCenter> <Name>DcName1</Name> <Clusters> <Cluster HAEnabled="False" DrsEnabled="True"> <Name>Chicago</Name>
<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>
DcName1
芝加哥
vm01.domain.com
vm02.domain.com
代托纳
spa001.domain.com
spa002.domain.com
DcName2
克利夫兰
vm20.domain.com
vm21.domain.com
圣路易斯
vm07.domain.com
vm08.domain.com
spa001.domain.com
6.0.0
5572656
思科系统公司
UCSC-C240-M4SX
spa002.domain.com
6.0.0
5572656
思科系统公司
UCSC-C240-M4SX
下面是我正在使用的代码。这将拉动所有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());
}
IEnumerable vmHostsRows=来自XmlDoc.substands(“VMHosts”)中的vmHostRows
选择vmHostRows;
IEnumerable vmHostList=来自vmHostsRows.substands(“VMHost”)中的vmHostList
选择vmHostList;
foreach(VMHostList中的XElement vHosts)
{
Show(vHosts.Element(“Name”).Value.ToString());
}
它返回所有VMHosts
元素的原因是因为您使用的是子体。此方法返回与名称匹配的任何元素,无论它在xml中的何处。
您应该改用元素
,因为这将只返回您从中调用它的元素的直接子元素。在您的例子中,应该在xml的根元素上调用它(我假设您的xml有一个根元素,您没有显示):
IEnumerable-VMHostList=XmlDoc.Root.Element(“VMHosts”).Elements(“VMHost”);
foreach(VMHostList中的XElement vHosts)
{
Show(vHosts.Element(“Name”).Value.ToString());
}
它返回所有VMHosts
元素的原因是因为您使用的是子体。此方法返回与名称匹配的任何元素,无论它在xml中的何处。
您应该改用元素
,因为这将只返回您从中调用它的元素的直接子元素。在您的例子中,应该在xml的根元素上调用它(我假设您的xml有一个根元素,您没有显示):
IEnumerable-VMHostList=XmlDoc.Root.Element(“VMHosts”).Elements(“VMHost”);
foreach(VMHostList中的XElement vHosts)
{
Show(vHosts.Element(“Name”).Value.ToString());
}
这正是我被难住的地方。谢谢你的解释。很高兴我能帮忙!这正是我被难住的地方。谢谢你的解释。很高兴我能帮忙!“示例”不是有效的XML。它是来自输出的示例。我有几十个这样的。发布时它是无效的。“示例”是无效的XML。这是一个输出示例。我有几十个这样的。因为张贴它是无效的。
IEnumerable<XElement> vmHostLists = XmlDoc.Root.Element("VMHosts").Elements("VMHost");
foreach (XElement vHosts in vmHostLists)
{
MessageBox.Show(vHosts.Element("Name").Value.ToString());
}