Проходить по разделу, не вытягивая все элементы с одинаковыми именами - PullRequest
0 голосов
/ 12 октября 2018

Попытка создать объект для циклического прохождения этих данных, чтобы получить информацию о сервере.В разных узлах есть элементы с одинаковыми именами.Ниже приведен пример 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());
  }

1 Ответ

0 голосов
/ 15 октября 2018

Причина возврата всех элементов VMHosts в том, что вы используете Descendants.Этот метод возвращает любой элемент, который соответствует имени, независимо от того, где он находится в 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());
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...