Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环通过节,而不拉动同名的所有元素_C#_Linq_Linq To Xml - Fatal编程技术网

C# 循环通过节,而不拉动同名的所有元素

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>

试图创建一个对象来循环该数据以获取服务器信息。不同节点中存在同名元素。下面是一个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>

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